Dynamic-Calibration/utils/YALMIP-master/extras/classifyfactors.m

125 lines
3.4 KiB
Matlab
Executable File

function [constants,general,singles,pairs] = classifyfactors(L,M,R)
nfac = length(L);
used = zeros(1,nfac);
constants = 0;
general = 0;
singles = {};
pairs = {};
for i = 1:length(L)
if isa(M{i},'double')
constants = constants + L{i}*M{i}*R{i};
used(i)=1;
end
end
for i = 1:length(L)
if ~used(i)
temp = struct(M{i});
if ~(is(M{i},'sdpcone') || is(M{i},'lpcone') || isequal(temp.originalbasis,'skew') || isequal(temp.originalbasis,'diagonal'))
general = general + L{i}*M{i}*R{i};
used(i) = 1;
elseif size(M{i},2)~=size(R{i},1) | size(M{i},1)~=size(L{i},2)
% Something like scalar*matrix
% simplifies code if we treat that as a general
general = general + L{i}*M{i}*R{i};
used(i) = 1;
end
end
end
% sameL = [];
% sameR = [];
% for i = 1:length(L)-1
% for j = i+1:length(L)
% if isequal(M{i},M{j})
% if isequal(L{i},L{j})
% mmm(i,j) = 1;
% mmm(j,i) = 1;
% sameL = [sameL;i j];
% elseif isequal(R{i},R{j})
% sameR = [sameR;i j];
% mmm(i,j) = 1;
% mmm(j,i) = 1;
% end
% end
% end
% end
% if length(sameL)>1
% for i = 1:size(sameL,1)-1
% for j = 2:size(sameL,2)
% AA = sameL([i j],:);
% BB = sameR([i j],:);
% if AA == BB'
% candidate = unique([AA(:);BB(:)]);
% end
% end
% end
% end
for i = 1:length(L)
if issymmetric(M{i}) && isequal(find(L{i}),find(R{i}'))
Rttmp = R{i}';
tmp = L{i}(L{i}~=0)./(Rttmp(Rttmp~=0));
else
tmp = [];
end
if ~used(i)
if issymmetric(M{i}) && (isequal(L{i},R{i}'))
singles{end+1}.L = L{i};
singles{end}.M = M{i};
singles{end}.R = R{i};
singles{end}.negated = 0;
used(i)=1;
elseif issymmetric(M{i}) && (isequal(L{i},-R{i}'))
singles{end+1}.L = L{i};
singles{end}.M = M{i};
singles{end}.R = R{i};
singles{end}.negated = 1;
used(i)=1;
elseif issymmetric(M{i}) && isequal(find(L{i}),find(R{i}')) & length(unique(tmp)) == 1
% Rttmp = R{i}';
% tmp = L{i}(L{i}~=0)./(Rttmp(Rttmp~=0));
% if length(unique(tmp)) == 1
singles{end+1}.L = L{i}/sqrt(abs(tmp(1)));
singles{end}.M = M{i};
singles{end}.R = R{i}*sqrt(abs(tmp(1)));
if tmp(1) > 0
singles{end}.negated = 0;
else
singles{end}.negated = 1;
end
used(i)=1;
% end
else
for j = i+1:length(L)
if isa(L{i}*M{i}*R{i}-R{j}'*M{j}'*L{j}','double')
pairs{end+1}.L = L{i};
pairs{end}.M = M{i};
pairs{end}.R = R{i};
used(j)=1;
used(i)=1;
break
end
end
end
end
end
for k = find(~used)
if isequal(size(M{k}),[1 1])
general = general + L{k}*M{k}*R{k};
else
error('Couldn''t classify all factors');
end
end