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

25 lines
825 B
Mathematica
Raw Permalink Normal View History

2019-12-18 11:25:45 +00:00
function Z = cleandoublefactors(Z)
if isempty(Z.midfactors)
return
end
for i = 1:length(Z.midfactors)
isnumeriq(i) = isnumeric(Z.midfactors{i});
end
isnumeriq = find(isnumeriq);
if length(isnumeriq)>1
total = Z.leftfactors{isnumeriq(1)}*Z.midfactors{isnumeriq(1)}*Z.rightfactors{isnumeriq(1)};
for i = isnumeriq(2:end)
total = total + Z.leftfactors{i}*Z.midfactors{i}*Z.rightfactors{i};
end
allfactors = 1:length(Z.midfactors);
keepfactors = setdiff(allfactors,isnumeriq(2:end));
Z.midfactors{isnumeriq(1)} = total;
Z.leftfactors{isnumeriq(1)} = speye(size(total,1));
Z.rightfactors{isnumeriq(1)} = speye(size(total,2));
Z.leftfactors = {Z.leftfactors{keepfactors}};
Z.rightfactors = {Z.rightfactors{keepfactors}};
Z.midfactors = {Z.midfactors{keepfactors}};
end