在一个立方体上的等距点

时间:2009-07-03 19:53:33

标签: algorithm matlab math 3d expectation-maximization

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

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

例如,假设我有八个点,我希望在一个大小为1x1x1的立方体中平均分配。我希望边长为0.333的立方体角上的点,在较大的立方体中心。

下面是一个2D示例。请注意,红点与彼此和边缘等距。我想要相同的3D。

Equidistant points

如果点数没有整数立方根,我可以在排列中留下一些“空白”。

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

如果在MATLAB中有一种简单的方法,我很乐意使用它。

5 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

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

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()返回的矩阵中的重复项,否则您可能无法删除足够的点数。)

答案 2 :(得分:1)

这看起来与sphere packing有关。

答案 3 :(得分:0)

在多维数据集中随机选择点,然后计算到最近邻居或墙的向量。然后,通过指数衰减步长来扩展最小向量的端点。如果你迭代地这样做,这些点应该收敛到最优解。如果点数不是立方数,这甚至可以工作。

答案 4 :(得分:-1)

一个好的随机生成器可能是第一个可用的第一近似值。也许用后来的过滤器重新定位(再次随机)最坏的罪犯。