4

我需要初始化一些三维点,我希望它们在整个立方体中等距分布。有没有创造性的方法来做到这一点?

我正在使用迭代期望最大化算法,我希望我的初始向量均匀地“跨越”空间。

例如,假设我想在一个大小为 1x1x1 的立方体中平均分配 8 个点。我想要边长为 0.333 的立方体角上的点,在较大的立方体内居中。

下面是一个 2D 示例。请注意,红点与彼此和边缘等距。我希望 3D 也一样。

等距点

在点数没有整数立方根的情况下,我可以在排列中留下一些“间隙”。

目前我正在取点数的立方根,并使用它来计算点数和它们之间的所需距离。然后我遍历这些点并增加 X、Y 和 Z 坐标(交错以使 Y 在 X 循环回 0 之前不会增加,对于 Z 而言与 Y 相同)。

如果在 MATLAB 中有一种简单的方法可以做到这一点,我很乐意使用它。

4

5 回答 5

5

您提出的采样策略称为 Sukharev 网格,它是最优的低分散采样策略,http ://planning.cs.uiuc.edu/node204.html 。在样本数不是 n^3 的情况下,从采样的角度来看,从网格中选择要省略的点并不重要。

在实践中,可以使用低差异(准随机)采样技术在三个维度上取得非常好的结果, http: //planning.cs.uiuc.edu/node210.html。您可能想看看使用 Halton 和 Hammersley 序列。

于 2009-07-03T22:07:43.047 回答
3

对于点数不是完美立方体的情况,您必须更详细地定义问题。但是,对于点数为立方体的情况,您可以使用:

l=linspace(0,1,n+2);
x=l(2:n+1); y=x; z=x;
[X, Y, Z] = meshgrid(x, y, z);

然后对于矩阵中的每个位置,该点的坐标由 X、Y 和 Z 的相应元素给出。如果您希望将点列在单个矩阵中,这样每行代表一个点,具有三列对于 x、y 和 z 坐标,您可以说:

points(:,1) = reshape(X, [], 1);
points(:,2) = reshape(Y, [], 1);
points(:,3) = reshape(Z, [], 1);

您现在n^3在整个单位立方体的网格上都有一个点列表,不包括边界。正如其他人所建议的那样,如果您想要更少的点,您可能会随机删除一些点。randi([0 n^3], a, 1)通过使用生成a要删除的点的索引,这很容易做到。(不要忘记检查由 返回的矩阵中的重复项randi(),否则您可能无法删除足够多的点。)

于 2009-07-03T22:20:20.837 回答
1

这看起来与球体包装有关。

于 2009-07-03T21:35:11.597 回答
0

在立方体内随机选择点,然后计算最近邻或墙的向量。然后,通过指数衰减步长扩展最小向量的端点。如果您反复执行此操作,则这些点应收敛到最优解。如果点的数量不是立方的,这甚至可以工作。

于 2009-07-03T22:52:56.807 回答
-1

一个好的随机生成器可能是第一个可用的第一个近似值。也许使用稍后的过滤器来重新定位(再次随机)最严重的违规者。

于 2009-07-03T21:05:23.233 回答