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

76 lines
2.1 KiB
Matlab
Executable File

function Z = ncvar_replace(X,Y,W)
% Call recurisvely for vector X
if length(X) > 1
dimX = size(X);
Z = [];
X = X(:);
for i = 1:length(X)
Z = [Z;ncvar_replace(X(i),Y,W)];
end
Z = reshape(Z,dimX);
return
end
% ...and recursively for vector Y
if length(Y) > 1
Z = X;
for i = 1:length(Y)
Z = ncvar_replace(Z,Y(i),W(i));
end
return
end
nonCommutingTable = yalmip('nonCommutingTable');
[monomtable,variabletype] = yalmip('monomtable');
if size(monomtable,1)>size(nonCommutingTable,1)
nonCommutingTable((1+size(nonCommutingTable,1)):(size(monomtable,1)),1) = (1+size(nonCommutingTable,1)):(size(monomtable,1));
end
% Cast commutative variables as nc temporarily by adding them to the table
commuting = find(~any(nonCommutingTable,2));
nonCommutingTable(commuting,1) = commuting;
base = getbase(X);
vars = getvariables(X);
yvar = getvariables(Y);
Z = X;
newMonoms = [1];
for i = vars
monTerms = nonCommutingTable(i,:);
% Possibilities
% [v(x) NC]
% [NAN NC]
if isa(Y,'sdpvar')
if isnan(monTerms(1))
% Purely non-commuting so no replacement can occur
newMonoms = [newMonoms;recover(i)];
else
% call recursively with sdpvar replace
if any(isnan(nonCommutingTable(monTerms(find(monTerms)))))
[ct,vt] = coefficients(recovernc(i),Y);
else
[ct,vt] = coefficients(recover(i),Y);
end
newMonomial = ct;
if degree(vt)>=1
newMonomial = newMonomial*W^degree(vt);
end
newMonoms = [newMonoms;newMonomial];
end
else
% Replacing a non-commuting with something else
newMonomial = 1;
for j = 2:max(find(monTerms))
if monTerms(j)==yvar
newMonomial = newMonomial*W;
else
newMonomial = newMonomial*recover(monTerms(j));
end
end
newMonoms = [newMonoms;newMonomial];
end
end
Z = reshape(base*newMonoms,size(X));