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

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

例如,假设我想在大小为 1x1x1 的立方体中均匀分布八个点。我想要边长为 0.333 的立方体角上的点,以较大的立方体为中心。

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

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

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

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

最佳答案

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

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

关于algorithm - 立方体上的等距点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1080638/

10-11 03:30