# Creating a covariance matrix with specified variances and correlations [duplicate]

I'm trying to generate a covariance matrix between two multivariate vectors with specified variances for each dimension, correlations between dimensions within a single vector, and cross-correlations between dimensions of the two vectors. When I try to generate multivariate normal data using this covariance matrix, I get a matrix not positive definite (PSD) error. Can someone please help me figure out why my matrix is not PSD? My Matlab code is below.

D = 2; % number of X variables
P = 3; % number of Y variables
N = 1000; % number of data points

%%% Choose variances of x's and y's
stdX = gamrnd(1, 1, D, 1);
stdY = gamrnd(1, 1, P, 1);

%%% Choose correlations between x's and y's
corrX = corrcov(wishrnd(eye(D), D+1));
corrY = corrcov(wishrnd(eye(P), P+1));
corrXY = unifrnd(-1, 1, D*P);

%%% Construct covariance matrix for x's
SigXX = nan(D);
for i = 1:D
for j = 1:D
if i == j
SigXX(i,j) = stdX(i).^2;
else
SigXX(i,j) = corrX(i,j).*stdX(i)*stdX(j);
end
end
end

%%% Construct covariance matrix for y's
SigYY = nan(P);
for i = 1:P
for j = 1:P
if i == j
SigYY(i,j) = stdY(i).^2;
else
SigYY(i,j) = corrY(i,j).*stdY(i)*stdY(j);
end
end
end

%%% Construct cross-covariance matrix
SigXY = nan(D, P);
for i = 1:D
for j = 1:P
SigXY(i,j) = corrXY(i,j)*stdX(i)*stdY(j);
end
end

%%% Construct full covariance matrix
Sig = [SigXX SigXY; SigXY' SigYY];

%%% Generate fake data
data = mvnrnd(zeros(D+P, 1), Sig, N);

• It's not PSD because you aren't using a procedure that will always produce valid correlation matrix. You can't specify entries arbitrarily.
– whuber
Mar 21 '18 at 22:15
• Thanks, @whuber. Are you referring to the lines where I generate Wishart random variables and then convert the draws into correlation matrices? If so, why is that not an acceptable way to specify correlations? Mar 21 '18 at 22:17