【问题标题】:Iterate over all vectors of length `L`遍历所有长度为“L”的向量
【发布时间】:2015-03-09 17:31:28
【问题描述】:

我如何迭代所有可能具有指定长度(例如单位长度)的d 维度的向量,其中delta 是步长。


注意delta 可以非常小,例如1e-3 是单位向量。 d 通常在 [0,5] 的范围内,但这不是硬性限制!


愚蠢的方法是使用delta*i 的列表作为i in [0,N) 并生成所有可能的组合,例如n 选择n 并选择总和为1 的组合。但这似乎效率很低,我确信有更好的方法我不知道。


拨片应至少接近均匀分布在表面上。

【问题讨论】:

  • 正如我所说,delta 是允许的一维最小变化。这将问题栅格化并从不可数的许多变为有限的范围。
  • 在 2D 中,您可以生成一组角度,从中可以计算矢量分量。在 3D(球坐标)中,您需要 2 个角度。我确信这可以推广到 D 维情况。编辑:见上面的@sbabbi
  • 如果delta 是沿一维 的最小允许变化,那么您将获得异常浓度的样本。它不会接近均匀分布。那是你要的吗? (换句话说,笛卡尔坐标不能平滑地映射到球体表面)
  • @drahnr 我不得不说这个问题似乎并不那么微不足道,而且我猜它根本与 C++ 无关,而是与数学和组合学有关。您也应该尝试将其发布在 mathoverflow 上。您可能需要检查一件事:mathoverflow.net/questions/24688/…

标签: c++ combinatorics


【解决方案1】:

好的,我想我知道你需要什么了。基本上,如果你选择

X=(X1, X2, ..., Xn)/norm(X)

其中X1, X2,..., Xn是正态分布N(0,1)(均值为0,标准差为1),norm(X)X的L2(欧几里得)范数,则保证向量X是均匀分布的穿过n维单位球面。

现在,由于您要离散化,只需从二项分布中绘制每个 Xi(在极限处,我们知道它变成了泊松分布,通过中心极限定理,它收敛到高斯分布,请参见 @ 987654321@ ),你就完成了。当然,您会在维度n 上得到指数缩放,但我认为没有其他方法,因为此类向量的数量随着维度呈指数缩放。

【讨论】:

  • 这是对高斯分布的巧妙运用。
  • @sbabbi,我希望第一部分是我最初的想法 :)
  • 离散 Xi 没有帮助,因为您需要 Xi/norm(X) 位于格子上
  • @BenVoigt 是的,那是真的......虽然看起来比我复杂一点,至少比周日晚上的问题复杂 :) 一个想法是从 N(0,1) 中挑选组件限制它们的范数从表面上看在epsilon 之内(如果你想要严格的平等,你会进入丢番图方程,这会让人头疼)。但同样,我很想看到这个问题的正确严格答案,我只是给出了物理学家的证明 :)) 我希望 OP 将它发布在 mathoverflow 上,因为那是它所属的站点,因为它没有太多与C++有关
  • 但这并不能保证delta的间距,所以我不仅需要同源分布,还需要样本向量之间的距离相等。对不起,如果在这里误导了你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多