5

我希望生成一些数据,这些数据代表代表 n 维的 n 立方体的点云的坐标。这些点应该均匀分布在整个 n 空间中,并且应该能够在它们之间以用户定义的间距生成。这些数据将存储在一个数组中。

4

3 回答 3

2

我找到了一个使用 Boost.MPL 的笛卡尔积的实现。

Boost 中也有一个实际的笛卡尔积,但那是一个预处理器指令,我认为它对你没有用。

于 2010-06-09T08:33:14.670 回答
1

为了简单起见,这里举一个普通立方体的例子,即一个具有 3 个维度的立方体。让它的边长为 1 并假设您希望点的间隔为 1/n。(这导致点的均匀矩形分布,不完全确定这是你想要的)。

现在一些伪代码:

for i=0;i<=n;i++   //NB i<=n because there will be n+1 points along each axis-parallel line
    for j=0;j<=n;j++
        for k=0;k<=n;k++
            addPointAt(i/n,j/n,k/n)  //float arithmetic required here

请注意,这不是任何东西的笛卡尔积,但似乎满足您的标准(一个特殊情况)。如果您希望点的间距不同,请调整循环开始和结束索引或间隔大小。

要将其推广到任何指定的更高维度很容易,请添加更多循环。

推广到直到运行时才知道的任何更高维度只是稍微困难一些。与其声明一个 N 维数组,不如声明一个具有相同数量元素的一维数组。然后你必须显式地编写索引算法,而不是让编译器为你编写它。

我希望你现在会告诉我这不是你想要的!如果不是,你能澄清一下。

于 2010-06-09T08:42:50.220 回答
0

您可以递归地执行此操作(伪代码):

Function Hypercube(int dimensions, int current, string partialCoords)
{
  for i=0, i<=steps, i++
  {
    if(current==dimensions)
      print partialCoords + ", " + i + ")/n";
    else if current==0
      Hypercube(dimensions, current+1, "( "+i);
    else
      Hypercube(dimensions, current+1, partialCoords+", "+i);
  }

}

你称之为:Hypercube(n,0,""); 这将打印所有点的坐标,但您也可以将它们存储在结构中。

于 2010-06-18T15:30:32.133 回答