嗨,我不确定我的算法是否正确,我正在尝试复制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/