我不认为Matlab具备生成任意分布多元随机变量的内置功能。事实上,对于一元随机数同样如此。但是,虽然可以基于累积分布函数轻松生成后者,但多元分布不存在CDF,因此生成这些数字要困难得多(主要问题在于2个或更多变量之间存在相关性)。因此,你提出的这个问题超出了本网站的范围。
既然半个答案胜过没有答案,以下是使用Matlab进行数值计算的平均值和更高次矩的方法:
xv=linspace(-50,50,101);
yv=linspace(-30,30,100);
[x y]=meshgrid(xv,yv);
A=floor(15*exp(-((x-10).^2+y.^2)/100)+15*exp(-((x+25).^2+y.^2)/100));
A=A/sum(A(:));
weight=trapz(xv,trapz(yv,A));
A=A/weight;
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
是正方形,则这不会明显。我建议在开发阶段避免对称量。