C ++ Как сгенерировать множество декартовых произведений n-мерных кортежей - PullRequest
5 голосов
/ 09 июня 2010

Я хочу сгенерировать некоторые данные, которые представляют координаты облака точек, представляющих n-куб из n измерений.Эти точки должны быть равномерно распределены по n-пространству и должны иметь возможность генерироваться с заданным пользователем интервалом между ними.Эти данные будут храниться в массиве.

Ответы [ 3 ]

2 голосов
/ 09 июня 2010

Я нашел реализацию декартового произведения, использующего Boost.MPL .

В Boost также есть фактический декартовый продукт, но это директива препроцессора, я предполагаю, что этобесполезен для вас.

1 голос
/ 09 июня 2010

Для простоты вот пример для обычного куба, то есть с 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 массив с тем же количеством элементов.Затем вы должны написать индексную арифметику явно вместо того, чтобы компилятор написал ее для вас.

Я ожидаю, что вы сейчас скажете мне, что это не то, что вы хотите!Если нет, не могли бы вы уточнить.

0 голосов
/ 18 июня 2010

Вы можете сделать это рекурсивно (псевдокод):

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);
  }

}

Вы называете это: Гиперкуб (n, 0, "");Это напечатает координаты всех точек, но вы также можете сохранить их в структуре.

...