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

60 lines
2.0 KiB
Mathematica
Raw Normal View History

2019-12-18 11:25:45 +00:00
%%*******************************************************************
%% Prod2: compute the block diagonal matrix A*B
%%
%% C = Prod2(blk,A,B,options);
%%
%% INPUT: blk = a cell array describing the block structure of A and B
%% A,B = square matrices or column vectors.
%%
%% options = 0 if no special structure
%% 1 if C is symmetric
%%*****************************************************************
%% SDPT3: version 4.0
%% Copyright (c) 1997 by
%% Kim-Chuan Toh, Michael J. Todd, Reha H. Tutuncu
%% Last Modified: 16 Sep 2004
%%*****************************************************************
function C = Prod2(blk,A,B,options);
global spdensity
if (nargin == 3); options = 0; end;
iscellA = iscell(A); iscellB = iscell(B);
%%
if (~iscellA & ~iscellB)
if (size(blk,1) > 1);
error('Prod2: blk and A,B are not compatible');
end;
if strcmp(blk{1},'s')
numblk = length(blk{2});
isspA = issparse(A); isspB = issparse(B);
if (numblk > 1)
if ~isspA; A=sparse(A); isspA=1; end
if ~isspB; B=sparse(B); isspB=1; end
end
%%use_matlab = (options==0 & ~isspA & ~isspB) | (isspA & isspB);
use_matlab = (~isspA & ~isspB) | (isspA & isspB);
if (use_matlab)
C = A*B;
if (options==1); C = 0.5*(C+C'); end;
else
C = mexProd2(blk,A,B,options);
end
checksparse = (numblk==1) & (isspA | isspB);
if (checksparse)
n2 = sum(blk{2}.*blk{2});
if (mexnnz(C) <= spdensity*n2);
if ~issparse(C); C = sparse(C); end;
else
if issparse(C); C = full(C); end;
end
end
elseif (strcmp(blk{1},'q') | strcmp(blk{1},'l') | strcmp(blk{1},'u'))
C = A.*B;
end
else
error(['Prod2: A,B must be matrices']);
end
%%*******************************************************************