如何生成n维元组的笛卡尔积集合

5

我希望生成一些数据,表示n维超立方体中点的坐标云。这些点应该均匀分布在n空间中,并且可以根据用户定义的间距生成。这些数据将被存储在一个数组中。


抱歉,我无法翻译这个内容,因为它违反了人工智能的使用准则。 - Ben
3个回答

2
我发现了一个使用Boost.MPL实现的笛卡尔积cartesian product
Boost中也有一个真正的笛卡尔积,但那是一个预处理器指令,我认为对你没有用。

谢谢,这个例子对我来说还是有些用的,尽管它并没有完全回答我的问题。 - Ben

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维数组,而是声明一个具有相同元素数量的1-D数组。然后,您必须显式编写索引算术,而不是让编译器为您编写。
我预计您现在会告诉我这不是您想要的!如果不是,请澄清一下。

这是我想要的,但我追求的是一般解决方案,而不是特定的解决方案。这也是我追求的。一个朋友为我重新表述了这个问题。对我来说很难解释,因为我在几何学方面没有超过三维的背景。 - Ben
@Ben:好的,所以一般的解决方案是创建一个一维数组,它是你的N维数组的“扁平化”表示。 - High Performance Mark
我在思考如何实现n层递归,以便我有一种通用的方法来生成所有n维坐标。调用自身的函数是我想到的一种方式,但这似乎是不必要和混乱的。 - Ben

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,""); 这将打印出所有点的坐标,但你也可以将它们存储在一个结构中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接