登录论坛

查看完整版本 : 立方体上的等距点


poster
2019-12-10, 16:49
我需要初始化一些三维点,并且希望它们在整个多维数据集中均等地分布。有什么创造性的方法可以做到这一点吗?

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

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

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

https://i.stack.imgur.com/V2HfW.png

在点数没有整数立方根的情况下,可以在安排中保留一些“空白”。

目前,我正在计算点数的立方根,并以此来计算点数和它们之间的期望距离。然后,我遍历这些点并递增X,Y和Z坐标(交错排列,以使Y在X循环回到0之前不会递增,对于Z而言,对于Y而言也是一样)。

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



更多&回答... (https://stackoverflow.com/questions/1080638)