【问题标题】:geometric random graph in a circle圆形几何随机图
【发布时间】:2011-08-03 11:49:30
【问题描述】:

我想在半径为 R 的球内生成一组随机均匀分布的坐标。在 Matlab 中,有没有什么方法可以在没有 for 循环的情况下以类似矩阵的形式做到这一点?

谢谢

更新: 我很抱歉造成混乱。我只需要在半径为 R 的圆上随机均匀地生成 n 个点,而不是球体。

【问题讨论】:

  • 您想在圆的上,还是在圆的区域内均匀地生成点?
  • 圆圈范围内

标签: matlab graph geometry topology


【解决方案1】:

不确定我是否正确理解了您的问题,但您不能通过设置分配给随机数的 φ、θ 和 r 在球体内生成任何随机数吗?

【讨论】:

  • 他希望它是均匀分布的。如果你均匀分布这三个变量,你会发现靠近中心的区域分布更密集,即不均匀。您可以在 x、y、z 上均匀分布并拒绝不在球体中的生成点,但这仍然需要循环(或者如果您真的必须避免循环,请使用递归,这在这里会很愚蠢。)
  • 啊!我懂了!然后,您可能需要一些分布概率,以降低随机选择导致密度变化的值的可能性。但是,您确定计算复杂度超过标准的蒙特卡罗方法,即如果点在球外,则简单地丢弃它?
  • 看起来上面 yoda 的链接 stackoverflow.com/questions/5408276 为您提供了如何向下分配值的答案。
  • 就个人而言,我会使用愚蠢的方法,因为我了解数学。如果我尝试实现归一化分布,我可能会在某个地方搞砸一个方程。
【解决方案2】:

我正准备将此标记为与generating uniform distribution of points in a sphere 上的上一个问题的重复,但我认为您应该在这里受到质疑,因为尽管问题中有一个 matlab 脚本,但该线程的大部分是 python。

问题中给出的这个小功能(我直接从那里粘贴)就是你需要的。

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);

要了解为什么您不能只对所有三个坐标使用统一随机变量,因为一个可能认为是正确的方法,give this article a read

【讨论】:

  • 您的维基百科链接似乎不适用于此处。那篇文章正在讨论如何在球体表面创建均匀分布,而这里我们是在在球形体积内创建均匀分布。
  • @gnovice:我没有将其作为解决方案提供,而是解释为什么直观的解决方案可能不起作用。论据 w.r.t.两种情况下的 PDF/CDF 相同。
  • @banana:我刚刚看到你更新的问题。您可以将上面的相同脚本用于圆上的点。语法为randsphere(N,2,R),其中N 是点数,R 是圆的半径。
【解决方案3】:

为了完整起见,这里是一些用于点剔除解决方案的 MATLAB 代码。它在单位立方体内生成一组随机点,移除单位球体之外的点,并将坐标点向上缩放以填充半径为R 的球体:

XYZ = rand(1000,3)-0.5;           %# 1000 random 3-D coordinates
index = (sum(XYZ.^2,2) <= 0.25);  %# Find the points inside the unit sphere
XYZ = 2*R.*XYZ(index,:);          %# Remove points and scale the coordinates

这种点剔除方法的一个主要缺点是难以生成特定个点。例如,如果你想在你的球体中生成 1000 个点,那么在剔除它们之前你必须在立方体中创建多少?如果将立方体中生成的点数放大6/pi 倍(即单位立方体的体积与单位球体的比值),则可以接近球体中所需的点数.但是,由于我们毕竟是在处理(伪)随机数,所以我们永远无法绝对确定我们会生成足够多的落在球体中的点。

简而言之,如果您想生成 特定 点数,我会尝试建议的其他解决方案之一。否则,点剔除解决方案既好又简单。

【讨论】:

  • 我也想过这个,但我想准确地生成 n 个点。最坏的情况下,我将在 c 中使用 for 循环并从 matlab 调用该函数。但我正在寻找更好的解决方案
【解决方案4】:

正确答案在这里http://mathworld.wolfram.com/DiskPointPicking.html。该分布称为“磁盘点拾取”

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多