94 lines
2.5 KiB
Mathematica
94 lines
2.5 KiB
Mathematica
|
|
function Z = addfactors(Z,X,Y)
|
||
|
|
if isnumeric(X) || isa(X,'logical')
|
||
|
|
if length(Y.midfactors)==0
|
||
|
|
return
|
||
|
|
end
|
||
|
|
% Y = refactor(Y);
|
||
|
|
Z.midfactors = Y.midfactors;
|
||
|
|
Z.leftfactors = Y.leftfactors;
|
||
|
|
Z.rightfactors = Y.rightfactors;
|
||
|
|
Z.midfactors{end+1} = X;
|
||
|
|
if length(X)>1
|
||
|
|
Z.leftfactors{end+1} = speye(size(X,1));
|
||
|
|
Z.rightfactors{end+1} = speye(size(X,2));
|
||
|
|
else
|
||
|
|
Z.leftfactors{end+1} = 1;
|
||
|
|
Z.rightfactors{end+1} = 1;
|
||
|
|
end
|
||
|
|
elseif isnumeric(Y) || isa(Y,'logical')
|
||
|
|
if length(X.midfactors)==0
|
||
|
|
return
|
||
|
|
end
|
||
|
|
% X = refactor(X);
|
||
|
|
Z.midfactors = X.midfactors;
|
||
|
|
Z.leftfactors = X.leftfactors;
|
||
|
|
Z.rightfactors = X.rightfactors;
|
||
|
|
Z.midfactors{end+1} = Y;
|
||
|
|
if length(Y)>1
|
||
|
|
Z.leftfactors{end+1} = speye(size(Y,1));
|
||
|
|
Z.rightfactors{end+1} = speye(size(Y,2));
|
||
|
|
else
|
||
|
|
Z.leftfactors{end+1} = 1;
|
||
|
|
Z.rightfactors{end+1} = 1;
|
||
|
|
end
|
||
|
|
else
|
||
|
|
if length(X.midfactors)==0 || length(Y.midfactors)==0
|
||
|
|
Z.midfactors = [];
|
||
|
|
Z.leftfactors = [];
|
||
|
|
Z.rightfactors = [];
|
||
|
|
return
|
||
|
|
end
|
||
|
|
% X = refactor(X);
|
||
|
|
% Y = refactor(Y);
|
||
|
|
|
||
|
|
if prod(X.dim)>0 && prod(Y.dim)==1
|
||
|
|
for i = 1:length(Y.midfactors)
|
||
|
|
Y.leftfactors{i} = repmat(Y.leftfactors{i},X.dim(1),1);
|
||
|
|
Y.rightfactors{i} = repmat(Y.rightfactors{i},1,X.dim(2));
|
||
|
|
end
|
||
|
|
end
|
||
|
|
if prod(Y.dim)>0 && prod(X.dim)==1
|
||
|
|
for i = 1:length(X.midfactors)
|
||
|
|
X.leftfactors{i} = repmat(X.leftfactors{i},Y.dim(1),1);
|
||
|
|
X.rightfactors{i} = repmat(X.rightfactors{i},1,Y.dim(2));
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
Z.leftfactors = {X.leftfactors{:},Y.leftfactors{:}};
|
||
|
|
Z.midfactors = {X.midfactors{:},Y.midfactors{:}};
|
||
|
|
Z.rightfactors = {X.rightfactors{:},Y.rightfactors{:}};
|
||
|
|
end
|
||
|
|
n = Z.dim(1);
|
||
|
|
m = Z.dim(2);
|
||
|
|
|
||
|
|
for i = 1:length(Z.midfactors)
|
||
|
|
% isdouble(i) = isa(Z.midfactors{i},'double');
|
||
|
|
if size(Z.leftfactors{i},1)~=n
|
||
|
|
if prod(size(Z.midfactors{i}))==1
|
||
|
|
Z.leftfactors{i} = ones(n,1);
|
||
|
|
else
|
||
|
|
error('Inconsistent factors. Please report bug');
|
||
|
|
end
|
||
|
|
end
|
||
|
|
if size(Z.rightfactors{i},2)~=m
|
||
|
|
if prod(size(Z.midfactors{i}))==1
|
||
|
|
Z.rightfactors{i} = ones(1,m);
|
||
|
|
else
|
||
|
|
error('Inconsistent factors. Please report bug');
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
Z = cleandoublefactors(Z);
|
||
|
|
try
|
||
|
|
Z = flushmidfactors(Z);
|
||
|
|
catch
|
||
|
|
1
|
||
|
|
end
|
||
|
|
|
||
|
|
function Z = refactor(Z)
|
||
|
|
if isempty(Z.midfactors)
|
||
|
|
Z.leftfactors{1} = 1;
|
||
|
|
Z.midfactors{1} = Z;
|
||
|
|
Z.rightfactors{1} = 1;
|
||
|
|
end
|