给定M x M
期望的协方差,R
和所需数量的样本向量,N
计算N x M
高斯随机向量,X
in vanilla MATLAB(即不能使用r = mvnrnd(MU,SIGMA,cases)
)。
不确定如何解决这个问题,通常你需要一个协方差并且意味着generate a Gaussian random variable。我认为sqrtm
和chol
可能很有用。
答案 0 :(得分:3)
如果您可以访问MATLAB统计工具箱,则可以在MATLAB中键入edit mvnrnd
以查看其解决方案。
[T p] = chol(sigma);
if m1 == c
mu = mu';
end
mu = mu(ones(cases,1),:);
r = randn(cases,c) * T + mu;
指出这一点几乎就像作弊一样,但编辑MATLAB的源代码对于理解一般情况非常有用。如果您没有工具箱,也可以在Google上搜索mvnrnd.m
。
答案 1 :(得分:3)
示例:
% 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')
以上代码使用统计工具箱(mvnrnd和mvnpdf)中的函数。如果您无权访问它,请考虑这些替换(使用其他人提到的相同概念):
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));