51 lines
1.5 KiB
Mathematica
51 lines
1.5 KiB
Mathematica
|
|
%%*********************************************************
|
||
|
|
%% Atyfun: compute sum_{k=1}^m yk*Ak.
|
||
|
|
%%
|
||
|
|
%% Q = Atyfun(blk,At,permA,isspAy,y);
|
||
|
|
%%
|
||
|
|
%% Note: permA and isspAy may be set to [].
|
||
|
|
%%*****************************************************************
|
||
|
|
%% SDPT3: version 4.0
|
||
|
|
%% Copyright (c) 1997 by
|
||
|
|
%% K.C. Toh, M.J. Todd, R.H. Tutuncu
|
||
|
|
%% Last Modified: 16 Sep 2004
|
||
|
|
%%*****************************************************************
|
||
|
|
|
||
|
|
function Q = Atyfun(blk,At,permA,isspAy,y);
|
||
|
|
|
||
|
|
if isempty(permA); ismtpermA = 1; else; ismtpermA = 0; end
|
||
|
|
|
||
|
|
Q = cell(size(blk,1),1);
|
||
|
|
if isempty(isspAy); isspAy = ones(size(blk,1),1); end
|
||
|
|
for p = 1:size(blk,1)
|
||
|
|
pblk = blk(p,:);
|
||
|
|
if strcmp(pblk{1},'s')
|
||
|
|
n = sum(pblk{2});
|
||
|
|
m1 = size(At{p,1},2);
|
||
|
|
if (~isempty(At{p,1}))
|
||
|
|
if (ismtpermA)
|
||
|
|
tmp = At{p,1}*y(1:m1);
|
||
|
|
else
|
||
|
|
tmp = At{p,1}*y(permA(p,1:m1),1);
|
||
|
|
end
|
||
|
|
Q{p} = smat(pblk,tmp,isspAy(p));
|
||
|
|
else
|
||
|
|
Q{p} = sparse(n,n);
|
||
|
|
end
|
||
|
|
if (length(pblk) > 2) %% for low rank constraints
|
||
|
|
len = sum(pblk{3});
|
||
|
|
m2 = length(pblk{3});
|
||
|
|
y2 = y(m1+[1:m2]);
|
||
|
|
dd = At{p,3};
|
||
|
|
idxD = [0; find(diff(dd(:,1))); size(dd,1)];
|
||
|
|
yy2 = mexexpand(diff(idxD),y2);
|
||
|
|
DD = spconvert([dd(:,2:3),dd(:,4).*yy2; len,len,0]);
|
||
|
|
Q{p} = Q{p} + At{p,2}*DD*At{p,2}';
|
||
|
|
end
|
||
|
|
else
|
||
|
|
Q{p} = At{p,1}*y;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
%%*********************************************************
|
||
|
|
|