Dynamic-Calibration/utils/YALMIP-master/@sdpvar/addfactors.m

94 lines
2.5 KiB
Mathematica
Raw Normal View History

2019-12-18 11:25:45 +00:00
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