这个question中的算法告诉我们如何有效地从多维球中采样。有没有一种方法可以同样有效地从多维环中进行采样,例如,r1<r<r2
我希望对这个标度函数做一个不太复杂的修改
r*(gammainc(s2/2,n/2).^(1/n))./sqrt(s2)
是可能的。(平庸免责声明:甚至还没有为原始缩放函数计算代数/几何)。在
原始matlab代码复制:
function X = randsphere(m,n,r)
% This function returns an m by n array, X, in which
% each of the m rows has the n Cartesian coordinates
% of a random point uniformly-distributed over the
% interior of an n-dimensional hypersphere with
% radius r and center at the origin. The function
% 'randn' is initially used to generate m sets of n
% random variables with independent multivariate
% normal distribution, with mean 0 and variance 1.
% Then the incomplete gamma function, 'gammainc',
% is used to map these points radially to fit in the
% hypersphere of finite radius r with a uniform % spatial distribution.
% Roger Stafford - 12/23/05
X = randn(m,n);
s2 = sum(X.^2,2);
X = X.*repmat(r*(gammainc(s2/2,n/2).^(1/n))./sqrt(s2),1,n);
包含来自Daniel's answer的演示的等效python代码:
^{pr2}$
经过一番反复试验,我终于用gammainc方法完成了。它背后的数学是我无法理解的,但我基本上把gammainc中的系数2改为幂z来提高一致性。在
还测试了它在三维和似乎工作良好。在
(这在我的待办事项列表中已经有一段时间了,谢谢你的建议!)在
最后一种方法here(1)适用于任何维度的球体:
在球体上随机选取一个点:
-生成N个高斯随机变量
x1,x2..xN
-求x的范数[i]
则矢量ux[i]在曲面SN-1上的分布是均匀的
在环内提供均匀分布:
-在范围内生成均匀随机
R_NPow = RandomUniform(R_Inner
N, R_Outer
N)得到半径(比如this 2D case)
R = R_NPow
1/N然后计算得到的点坐标:
^{pr2}$(1)Muller,M.E.“关于在维球面上均匀生成点的一种方法的注记”,通讯协会计算机。机器。1959年4月2日19-20日。在
实际上,我最后使用了反cdf方法来处理均匀分布在球体上的点
像这样
测试
^{pr2}$这可能相当于@Mbo的答案,但不幸的是我没有时间去测试。如果有人能验证他的答案,我很乐意接受。在
相关问题 更多 >
编程相关推荐