2022/4/28
用C++实现多元正态分布抽样
本地目录:E:MasterstudyCppMultivariateNormalDistributionSamples
参考资料[1]https://ros-developer.com/2017/11/15/generating-multivariate-normal-distribution-samples-using-c11-eigen-library/
[2]https://github.com/beniz/eigenmvn
[3]http://arma.sourceforge.net/
[4]http://arma.sourceforge.net/docs.html#mvnrnd
思路在R语言中可以轻松调用rmvnorm()函数实现从多元正态分布中抽样,我希望在C++中实现这种功能。经过一番搜索,找到两种方法。
- 使用Armadillo库的mvnrnd()函数[3-4]
- 使用Eigen库自行编写[1-2]
使用vcpkg安装Armadillo库
在E:softwarevcpkg目录下,右键,在终端中打开,输入命令
./vcpkg install Armadillo
等待漫长的下载安装过程,即可安装完成32位Armadillo库
再输入命令
./vcpkg install Armadillo:x64-windows
等待漫长的下载安装过程,即可安装完成64位Armadillo库
使用Eigen库自行编写该方法较为复杂,经过试验,放弃使用
源码在VS2019中,输入以下代码,编译链接
// MultivariateNormalDistributionSamples.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // 参考资料:http://arma.sourceforge.net/ // https://stackoverflow.com/questions/6142576/sample-from-multivariate-normal-gaussian-distribution-in-c #include运行结果#include //包含armadillo头文件 using namespace std; using namespace arma;//armadillo命名空间 int main() { cout << "Armadillo version: " << arma_version::as_string() << endl; mat A = randu (4, 5);//4行5列矩阵 mat B = randu (4, 5); cout << "A*B.t():n" << A * B.t() << endl;//.t()向量或矩阵转置 (A * B.t()).print("A*B.t():"); vec M(5, fill::randu); mat D(5, 5, fill::randu); mat C = D.t() * D; mat X = mvnrnd(M, C, 5); cout << "X:n" << X << endl; system("pause"); return 0; }
Armadillo version: 10.6.2 (Keep Calm) A*B.t(): 1.0269 1.0702 1.3516 1.9736 1.0553 1.6784 1.7857 1.7695 0.5042 0.4844 0.5324 1.0123 0.6624 1.3403 1.2322 1.2464 A*B.t(): 1.0269 1.0702 1.3516 1.9736 1.0553 1.6784 1.7857 1.7695 0.5042 0.4844 0.5324 1.0123 0.6624 1.3403 1.2322 1.2464 X: 2.1518 -1.9524 -1.3810 0.4499 -0.5635 2.5495 -2.1896 -2.4168 -0.1311 -0.6948 3.1666 -0.0019 0.4300 -0.1362 0.8860 4.2867 -1.7698 -0.2368 0.3843 0.3144 1.8961 -0.4027 0.5270 1.2690 0.4838 请按任意键继续. . .



