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

81 lines
1.7 KiB
Matlab
Executable File

function [F,h,x] = sedumi2yalmip(At,b,c,K)
nvars = length(b);
x = sdpvar(nvars,1);
% No reason to try to do factor tracking here
x = flush(x);
if size(At,2)~=length(b)
At = At';
end
F = ([]);
top = 1;
if isvalidfield(K,'f')
X = c(top:top+K.f-1)-At(top:top+K.f-1,:)*x;
F = F + (X(:) == 0);
top = top + K.f;
end
if isvalidfield(K,'l')
X = c(top:top+K.l-1)-At(top:top+K.l-1,:)*x;
F = F + (X(:)>=0);
top = top + K.l;
end
if isvalidfield(K,'q')
for i = 1:length(K.q)
X = c(top:top+K.q(i)-1)-At(top:top+K.q(i)-1,:)*x;
F = F + (cone(X(2:end),X(1)));
top = top + K.q(i);
end
end
if isvalidfield(K,'r')
for i = 1:length(K.r)
X = c(top:top+K.r(i)-1)-At(top:top+K.r(i)-1,:)*x;
F = F + (rcone(X(3:end),X(2),X(1)));
top = top + K.r(i);
end
end
if isvalidfield(K,'s')
for i = 1:length(K.s)
[ix,iy,iv] = find([c(top:top+K.s(i)^2-1) At(top:top+K.s(i)^2-1,:)]);
off = (ix-1)/(K.s(i)+1);
if all(off == round(off))
X = c(top:top+K.s(i)^2-1)-At(top:top+K.s(i)^2-1,:)*x;
if isa(X,'sdpvar')
F = F + (diag(reshape(X,K.s(i),K.s(i))) >= 0);
else
X
i
'silly data!'
end
top = top + K.s(i)^2;
else
X = c(top:top+K.s(i)^2-1)-At(top:top+K.s(i)^2-1,:)*x;
X = reshape(X,K.s(i),K.s(i));
X = (X+X')/2;
F = F + (X >= 0);
top = top + K.s(i)^2;
end
end
end
h = -b'*x;
function ok = isvalidfield(K,fld)
ok = 0;
if isfield(K,fld)
s = getfield(K,fld);
if prod(size(s))>0
if s(1)>0
ok = 1;
end
end
end