54 lines
2.1 KiB
Mathematica
54 lines
2.1 KiB
Mathematica
|
|
%%*****************************************************************
|
||
|
|
%% NTscaling: Compute NT scaling matrix
|
||
|
|
%%
|
||
|
|
%% compute SVD of Xchol*Zchol via eigenvalue decompostion of
|
||
|
|
%% Zchol * X * Zchol' = V * diag(sv2) * V'.
|
||
|
|
%% compute W satisfying W*Z*W = X.
|
||
|
|
%% W = G'*G, where G = diag(sqrt(sv)) * (invZchol*V)'
|
||
|
|
%% important to keep W symmertic.
|
||
|
|
%%*****************************************************************
|
||
|
|
%% SDPT3: version 4.0
|
||
|
|
%% Copyright (c) 1997 by
|
||
|
|
%% Kim-Chuan Toh, Michael J. Todd, Reha H. Tutuncu
|
||
|
|
%% Last Modified: 16 Sep 2004
|
||
|
|
%%*****************************************************************
|
||
|
|
|
||
|
|
function [W,G,sv,gamx,gamz,dd,ee,ff] = ...
|
||
|
|
NTscaling(blk,X,Z,Zchol,invZchol);
|
||
|
|
|
||
|
|
numblk = size(blk,1);
|
||
|
|
W = cell(numblk,1); G = cell(numblk,1); sv = cell(numblk,1);
|
||
|
|
gamx = cell(numblk,1); gamz = cell(numblk,1);
|
||
|
|
dd = cell(numblk,1); ee = cell(numblk,1); ff = cell(numblk,1);
|
||
|
|
%%
|
||
|
|
for p = 1:size(blk,1)
|
||
|
|
pblk = blk(p,:);
|
||
|
|
numblk = length(pblk{2});
|
||
|
|
n = sum(pblk{2});
|
||
|
|
if strcmp(pblk{1},'l')
|
||
|
|
dd{p} = X{p}./Z{p}; %% do not add perturbation, it badly affects cre-a
|
||
|
|
elseif strcmp(pblk{1},'q');
|
||
|
|
gamx{p} = sqrt(qops(pblk,X{p},X{p},2));
|
||
|
|
gamz{p} = sqrt(qops(pblk,Z{p},Z{p},2));
|
||
|
|
w2 = gamz{p}./gamx{p}; w = sqrt(w2);
|
||
|
|
dd{p} = qops(pblk,1./w2,ones(n,1),4);
|
||
|
|
tt = qops(pblk,1./w,Z{p},3) - qops(pblk,w,X{p},4);
|
||
|
|
gamtt = sqrt(qops(pblk,tt,tt,2));
|
||
|
|
ff{p} = qops(pblk,1./gamtt,tt,3);
|
||
|
|
ee{p} = qops(pblk,sqrt(2)./w,ff{p},4);
|
||
|
|
elseif strcmp(pblk{1},'s')
|
||
|
|
tmp = Prod2(pblk,Zchol{p},X{p},0);
|
||
|
|
tmp = Prod2(pblk,tmp,Zchol{p}',1);
|
||
|
|
[sv2,V] = blkeig(pblk,tmp);
|
||
|
|
sv2 = max(1e-20,sv2);
|
||
|
|
sv{p} = sqrt(sv2);
|
||
|
|
tmp = Prod2(pblk,invZchol{p},V);
|
||
|
|
G{p} = Prod2(pblk,spdiags(sqrt(sv{p}),0,n,n),tmp');
|
||
|
|
W{p} = Prod2(pblk,G{p}',G{p},1);
|
||
|
|
end
|
||
|
|
end
|
||
|
|
%%**********************************************************************
|
||
|
|
|
||
|
|
|
||
|
|
|