2

假设在Matlab中生成一个分布为N(u, diag(sigma_1^2, ..., sigma_n^2)的n维正态随机数,其中u是一个垂直向量。

有两种方法。

randn(n,1).*[sigma_1, ..., sigma_n]' + u;

mvnrnd(u', diag(sigma_1^2, ..., sigma_n^2))';

我认为他们都是正确的。但我想知道基于某些原因,是否有某种偏好?我问这个问题,因为我看到别人总是选择第一种方式,而我没有考虑就选择了第二种方式。

谢谢并恭祝安康!

4

2 回答 2

2

如果随机变量之间存在相关性,则协方差矩阵不再是对角线。在这种情况下,您可以使用mvnrndrandn与 Cholesky 解压缩一起使用,如下所示。

U = chol(SIGMA);
x = U'*randn(n,1);

尽可能使用基本功能而不是使用工具箱功能。基本功能更快、更便携。

于 2013-09-27T11:32:50.433 回答
2

它们是等效的方法。就个人而言,我更喜欢第二种选择,因为它是一个可用于为任意形状的数组生成此类数据的函数。如果你突然想要一个完整的高斯值矩阵,你可以从第二个函数调用中更容易地得到它,而无需调用reshape(). 我还认为第二个示例更易于阅读,因为它依赖于长期以来无处不在的内置 Matlab。

我想如果n很大,人们可能会争辩说实际形成diag(sigma_1^2, ..., sigma_n^2). 但是,如果您需要从这么大的矩阵中进行随机抽取,那么 Matlab 已经是该工作的错误工具,您应该在 C++ 中使用 Boost::Probability,或者在 Python 中使用 SciPy / scikits.statsmodels。

于 2012-04-24T15:08:18.590 回答