简体   繁体   中英

Given a covarince matrix, generate a Gaussian random variable in Matlab

Given a M x M desired covariance, R , and a desired number of sample vectors, N calculate a N x M Gaussian random vector, X in vanilla MATLAB (ie can't use r = mvnrnd(MU,SIGMA,cases) ).

Not really sure how to tackle this, usually you need a covariance AND mean to generate a Gaussian random variable . I think sqrtm and chol could be useful.

If you have access to the MATLAB statistics toolbox you can type edit mvnrnd in MATLAB to see their solution.

[T p] = chol(sigma);
if m1 == c
  mu = mu';
end
mu = mu(ones(cases,1),:);
r = randn(cases,c) * T + mu;

It feels almost like cheating to point this out, but editing MATLAB's source is very useful to understand things in general. You can also search for mvnrnd.m on google if you don't have the toolbox.

Example:

% Gaussian mean and covariance
d = 2;             % number of dimensions
mu = rand(1,d);
sigma = rand(d,d); sigma = sigma*sigma';

% generate 100 samples from above distribution
num = 100;
X = mvnrnd(mu, sigma, num);

% plot samples (only for 2D case)
scatter(X(:,1), X(:,2), 'filled'), hold on
ezcontour(@(x,y) mvnpdf([x y], mu, sigma), xlim(), ylim())
title('X~N(\mu,\sigma)')
xlabel('X_1'), ylabel('X_2')

2d高斯样本

The above code uses functions from the Statistics toolbox ( mvnrnd and mvnpdf ). If you don't have access to it, consider these replacements (using the same concepts mentioned by others):

mvnrnd = @(mu,S,num) bsxfun(@plus, randn(num,numel(mu))*cholcov(S), mu);

mvnpdf = @(x,mu,S) exp(-0.5*(x-mu)*(S\(x-mu)')) / sqrt((2*pi)^d*det(S));

多元正态分布PDF

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM