我不相信 matlab 具有生成具有任意分布的多元随机变量的内置功能。事实上,单变量随机数也是如此。但是虽然后者可以很容易地根据累积分布函数生成,但多元分布不存在 CDF,因此生成这样的数字要麻烦得多(主要问题是 2 个或更多变量具有相关性)。所以你的这部分问题远远超出了本站的范围。
由于有一半的答案总比没有答案好,以下是如何使用 matlab 数值计算均值和更高矩的方法:
%generate some dummy input
xv=linspace(-50,50,101);
yv=linspace(-30,30,100);
[x y]=meshgrid(xv,yv);
%define a discretized two-hump Gaussian distribution
A=floor(15*exp(-((x-10).^2+y.^2)/100)+15*exp(-((x+25).^2+y.^2)/100));
A=A/sum(A(:)); %normalized to sum to 1
%plot it if you like
%figure;
%surf(x,y,A)
%actual half-answer starts here
%get normalized pdf
weight=trapz(xv,trapz(yv,A));
A=A/weight; %A normalized to 1 according to trapz^2
%mean
mean_x=trapz(xv,trapz(yv,A.*x));
mean_y=trapz(xv,trapz(yv,A.*y));
因此,关键是您可以使用对trapz 的两次连续调用对矩形网格执行二重积分。这允许您计算与网格具有相同形状的任何数量的积分,但缺点是必须独立计算矢量分量。如果您只想计算可以用x 和y 参数化的东西(它们的大小自然与您的网格相同),那么您无需做任何额外的思考就可以相处。
您还可以为集成定义一个函数:
function res=trapz2(xv,yv,A,arg)
if ~isscalar(arg) && any(size(arg)~=size(A))
error('Size of A and var must be the same!')
end
res=trapz(xv,trapz(yv,A.*arg));
end
这样你就可以计算出类似的东西
weight=trapz2(xv,yv,A,1);
mean_x=trapz2(xv,yv,A,x);
注意:我在示例中使用 101x100 网格的原因是对 trapz 的双重调用应该以正确的顺序执行。如果您在调用中交换xv 和yv,由于与A 的定义不一致,您会得到错误的答案,但如果A 是正方形,这将不明显。我建议在开发阶段避免使用对称量。