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);