在一个立方体上的等距点

M. *_*ley 4 algorithm math 3d matlab expectation-maximization

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

我使用迭代期望最大化算法,我希望我的初始向量均匀地"跨越"空间.

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

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

等距点

如果点数没有整数立方根,我可以在排列中留下一些"间隙".

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

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

And*_*ker 5

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

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


use*_*368 3

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

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

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

points(:,1) = reshape(X, [], 1);
points(:,2) = reshape(Y, [], 1);
points(:,3) = reshape(Z, [], 1);
Run Code Online (Sandbox Code Playgroud)

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