Dynamic-Calibration/utils/SDPT3-4.0/Solver/svec.m

76 lines
2.1 KiB
Matlab
Executable File

%******************************************************************
%% svec: compute the vector svec(M),
%%
%% x = svec(blk,M,isspx);
%%*****************************************************************
%% SDPT3: version 4.0
%% Copyright (c) 1997 by
%% Kim-Chuan Toh, Michael J. Todd, Reha H. Tutuncu
%% Last Modified: 16 Sep 2004
%%*****************************************************************
function x = svec(blk,M,isspx);
if iscell(M)
if (size(blk,1) ~= size(M,1))
error('svec: number of rows in blk and M not equal');
end
if (nargin == 2)
%%if (size(M,2) == 1)
%% isspx = zeros(size(blk,1),1);
%%else
%% isspx = ones(size(blk,1),1);
%%end
isspx = ones(size(blk,1),1);
else
if (length(isspx) < size(blk,1))
isspx = ones(size(blk,1),1);
end
end
x = cell(size(blk,1),1);
for p=1:size(blk,1)
pblk = blk(p,:);
n = sum(pblk{2}); m = size(M,2);
if strcmp(pblk{1},'s')
n2 = sum(pblk{2}.*(pblk{2}+1))/2;
if (isspx(p));
x{p} = sparse(n2,m);
else
x{p} = zeros(n2,m);
end
numblk = length(pblk{2});
if (pblk{2} > 0)
for k = 1:m
if (numblk > 1) & ~issparse(M{p,k});
x{p}(:,k) = mexsvec(pblk,sparse(M{p,k}),isspx(p));
else
x{p}(:,k) = mexsvec(pblk,M{p,k},isspx(p));
end
end
end
else
if (isspx(p))
x{p} = sparse(n,m);
else
x{p} = zeros(n,m);
end
for k = 1:m
x{p}(:,k) = M{p,k};
end
end
end
else
if strcmp(blk{1},'s')
numblk = length(blk{2});
if (numblk > 1) & ~issparse(M);
x = mexsvec(blk,sparse(M),1);
else
x = mexsvec(blk,sparse(M));
end
else
x = M;
end
end
%%**********************************************************