125 lines
3.4 KiB
Matlab
Executable File
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
|
|
|
|
|