Dynamic-Calibration/utils/SDPT3-4.0/Examples/corrmat.m

37 lines
1.1 KiB
Mathematica
Raw Normal View History

2019-12-18 11:25:45 +00:00
%%****************************************************
%% corrmat: find the nearest correlation matrix
%% to a given symmetric matrix.
%%
%% [blk,At,C,b] = corrmat(H);
%%
%% min || X - H ||_F
%% s.t. diag(X) = e, X psd.
%%
%% min t
%% s.t. diag(X) = e
%% svec(X) + y = svec(H),
%% X psd, ||y||_2 <= t.
%%*****************************************************************
%% SDPT3: version 4.0
%% Copyright (c) 1997 by
%% Kim-Chuan Toh, Michael J. Todd, Reha H. Tutuncu
%% Last Modified: 16 Sep 2004
%%*****************************************************************
function [blk,At,C,b] = corrmat(H);
if size(H,1) ~= size(H,2); error('corrmat: matrix must be square'); end;
n = length(H);
n2 = n*(n+1)/2;
blk{1,1} = 's'; blk{1,2} = n;
for k=1:n; AA{1,k} = spconvert([k,k,1; n,n,0]); end;
matrepdiag = svec(blk(1,:),AA);
At{1,1} = [matrepdiag{1}, speye(n2)];
blk{2,1} = 'q'; blk{2,2} = n2+1;
At{2,1} = [sparse(n,n2+1); sparse(n2,1), speye(n2)];
b = [ones(n,1); svec(blk(1,:),H)];
C{1,1} = sparse(n,n); C{2,1} = [1; zeros(n2,1)];
%%****************************************************