37 lines
1.1 KiB
Matlab
Executable File
37 lines
1.1 KiB
Matlab
Executable File
%%****************************************************
|
|
%% 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)];
|
|
%%****************************************************
|