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

81 lines
2.5 KiB
Matlab
Executable File

%%*****************************************************************
%% blkeig: compute eigenvalue decomposition of a cell array
%% whose contents are square matrices or the diagonal
%% of a diagonal matrix.
%%
%% [d,V] = blkeig(blk,X);
%%*****************************************************************
%% SDPT3: version 4.0
%% Copyright (c) 1997 by
%% K.C. Toh, M.J. Todd, R.H. Tutuncu
%% Last Modified: 16 Sep 2004
%%*****************************************************************
function [d,V] = blkeig(blk,X);
spdensity = 0.5;
if ~iscell(X);
if strcmp(blk{1},'s');
blktmp = blk{2};
if (length(blktmp) == 1);
if (nargout == 1);
d = eig(full(X));
elseif (nargout == 2);
[V,d] = eig(full(X));
d = diag(d);
end
else
if (nargout == 2);
V = sparse(length(X),length(X));
end
d = zeros(sum(blktmp),1);
xx = mexsvec(blk,X,0);
blktmp2 = blktmp.*(blktmp+1)/2;
s2 = [0, cumsum(blktmp2)];
blksub{1,1} = 's'; blksub{1,2} = 0;
s = [0, cumsum(blktmp)];
for i = 1:length(blktmp)
pos = [s(i)+1 : s(i+1)];
blksub{2} = blktmp(i);
Xsub = mexsmat(blksub,xx(s2(i)+1:s2(i+1)),0);
if (nargout == 1);
lam = eig(Xsub);
elseif (nargout == 2);
[evec,lam] = eig(Xsub);
lam = diag(lam);
V(pos,pos) = sparse(evec);
end
d(pos,1) = lam;
end
end
n2 = sum(blktmp.*blktmp);
if (nargout == 2);
if (nnz(V) <= spdensity*n2);
V = sparse(V);
else
V = full(V);
end
end
elseif strcmp(blk{1},'l');
if (nargout == 2);
V = ones(size(X)); d = X;
elseif (nargout == 1);
d = X;
end
end
else
if (nargout == 2);
V = cell(size(X)); d = cell(size(X));
for p = 1:size(blk,1);
[d{p},V{p}] = blkeig(blk(p,:),X{p});
end
elseif (nargout == 1);
d = cell(size(X));
for p = 1:size(blk,1);
d{p} = blkeig(blk(p,:),X{p});
end
end
end
%%***************************************************************************