C语言产生一个以miu为均值,sigma为均方差的高斯分布的随机变量

本文介绍了一种基于Box-Muller变换的高斯随机数生成方法,通过两个均匀分布的随机变量,转换生成符合特定均值和标准差的高斯分布随机数。代码中包含了判断无穷大值的功能。
#include <stdlib.h>
#include <math.h>

//若a不是inf,则返回非0值,否则返回0
#define ISINF(a) ((a) <= DBL_MAX && (a) >= -DBL_MAX)

//产生一个以miu为均值,sigma为均方差的高斯分布的随机变量,结果需要使用上面的宏来判断是否为-inf
double gaussrand(double miu, double sigma)
{
	double U1, U2; 
	double Z, X;

	//产生两个服从U(0,1)分布的随机变量
	U1 = (double)rand() / RAND_MAX;
	U2 = (double)rand() / RAND_MAX;

	//这里的log是自然对数
	Z = sqrt(-2 * log(U2))*cos(2 * 3.1415926 * U1);

	X = miu + sigma*Z;

	return X;
}
在MATLAB中生成一个服从均值为零,协方差矩阵为&Sigma;的复高斯分布的向量,可以使用MATLAB内置函数`randn`生成服从标准正态分布的随机数,然后通过一定的线性变换来获得所需的复高斯分布向量。 首先,需要了解复高斯随机变量的实部和虚部是独立且同分布的,且每个部分服从均值为0的高斯分布。当复高斯随机向量的协方差矩阵为&Sigma;时,可以通过Cholesky分解将&Sigma;分解为两个矩阵的乘积:LL^H,其中L是一个下三角矩阵,H表示共轭转置。然后,可以通过生成两个独立的标准正态分布向量,分别与L和L^H相乘,再进行相应的组合来构造复高斯分布的向量。 以下是具体的MATLAB代码示例: ```matlab function cvec = generateComplexGaussian(mean, Sigma) % mean - 复高斯分布的协方差矩阵 % 获取向量长度 n = length(mean); % 检查均值是否为零向量 if any(mean ~= 0) error('均值向量必须为零向量'); end % 检查Sigma是否为方阵且半正定 if size(Sigma, 1) ~= n || size(Sigma, 2) ~= n error('Sigma必须是方阵'); end if min(eig(Sigma)) < 0 error('Sigma必须是半正定矩阵'); end % Cholesky分解 L = chol(Sigma, 'lower'); % 生成两个独立的标准正态分布向量 u = randn(n, 1) + 1i * randn(n, 1); % 进行线性变换得到复高斯分布向量 cvec = L * u; end ``` 使用这个函数,你可以如下调用它来生成一个服从特定均值和协方差的复高斯向量: ```matlab % 定义复高斯分布均值和协方差矩阵 mean = [0; 0]; % 均值为零向量 Sigma = [1, 0.5; 0.5, 1]; %方差矩阵 % 生成复高斯向量 cvec = generateComplexGaussian(mean, Sigma); ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值