假设在Matlab中生成一个n-dim正规随机数,其分布为N(u,diag(sigma_1 ^ 2,...,sigma_n ^ 2),其中u是垂直向量。
有两种方式。
randn(n,1).*[sigma_1, ..., sigma_n]' + u;
mvnrnd(u', diag(sigma_1^2, ..., sigma_n^2))';
我认为他们都是正确的。但我想知道基于某些原因是否有一个优先于另一个?我问这个问题,因为我看到另一个人总是选择第一种方式,而我选择第二种方式却没有考虑过。
谢谢和问候!
答案 0 :(得分:2)
它们是等效的方法。就个人而言,我更喜欢第二个选项,因为它是一个可用于为任意形状的数组生成此类数据的函数。如果你突然想要一个完整的高斯值矩阵,你可以从第二个函数调用中更容易地得到它,而不需要调用reshape()
。我还认为第二个例子更容易阅读,因为它依赖于Matlab的内置功能,这种内置功能已经无处不在了。
我认为如果n
很大,可能会认为实际形成diag(sigma_1^2, ..., sigma_n^2)
效率低下。但是如果你需要从一个大的矩阵中进行随机抽取,那么Matlab已经是错误的工具,你应该在C ++中使用Boost :: Probability,或者在Python中使用SciPy / scikits.statsmodels。
答案 1 :(得分:2)
如果随机变量之间存在相关性,则协方差矩阵不再是对角线。在这种情况下,您可以使用mvnrnd
或使用randn
与Cholesky解压缩如下。
U = chol(SIGMA);
x = U'*randn(n,1);
尽可能使用基本功能而不是使用工具箱功能。基本功能更快,更便携。