嗨,我不确定我的算法是否正确,我正在尝试复制matlab的mvnrnd函数,但在gsl中。我在一些期刊文章中发现了一种算法,该算法可以生成多元正态向量,但是我需要一个多元正态随机数矩阵

假设分布为Z〜(mu,sigma);

假设sigma是已经为正定的矩阵。

我在网上找到的算法说

1. cholskey(sigma) = A
2. generate uniform gaussian vector r
3. matrix vector triangular product with gsl_blas_dtrmv A * r
4. add mu to Ar and that will be a vector of multivariate normal random numbers


我下面的方法

以下是正确的以下更改以产生随机变量矩阵

    1. cholskey(sigma) = A
    2. generate uniform gaussian matrix R
    3. matrix matrix scalar product AR
    4. add mu to AR and that will be a matrix of multivariate normal random numbers

最佳答案

对,那是正确的。参见例如this Wikipedia entry on multivariate normal RNGs具有以下部分:


  从分布中提取值
  
  一种广泛使用的方法来从
  具有平均向量μ和的N维多元正态分布
  协方差矩阵Σ的工作原理如下:
  
  
  找到任何实矩阵A使得
  A AT =Σ。当Σ为正定时,则Cholesky分解为
  通常使用。 [...]
  令z =(z1,…,zN)T是一个分量为N的向量
  独立的标准正态变量(可以为
  例如,使用Box-Muller变换)。
  令x为μ+ Az。这有
  由于仿射变换特性而具有所需的分布。
  


其中描述了相同的算法。

R的实现也有多种,例如,每个R安装随附的MASS包中的mvrnorm

关于c++ - 在gsl中的matlab mvnrnd,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10405905/

10-11 23:08