给定M x M
所需的协方差R
和所需的样本向量数量,在 vanilla MATLAB 中N
计算N x M
高斯随机向量X
(即不能使用r = mvnrnd(MU,SIGMA,cases)
)。
不太确定如何解决这个问题,通常你需要一个协方差和均值来生成一个高斯随机变量。我认为sqrtm
并且chol
可能有用。
给定M x M
所需的协方差R
和所需的样本向量数量,在 vanilla MATLAB 中N
计算N x M
高斯随机向量X
(即不能使用r = mvnrnd(MU,SIGMA,cases)
)。
不太确定如何解决这个问题,通常你需要一个协方差和均值来生成一个高斯随机变量。我认为sqrtm
并且chol
可能有用。
例子:
% 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));
如果您可以访问 MATLAB 统计工具箱,您可以edit mvnrnd
在 MATLAB 中输入以查看他们的解决方案。
[T p] = chol(sigma);
if m1 == c
mu = mu';
end
mu = mu(ones(cases,1),:);
r = randn(cases,c) * T + mu;
指出这一点感觉就像在作弊,但是编辑 MATLAB 的源代码对于理解一般情况非常有用。mvnrnd.m
如果没有工具箱,也可以在 google 上搜索。