C++ Как сгенерировать множество декартовых произведений n-мерных кортежей

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

3 ответа

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

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

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

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

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

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,""); Это напечатает координаты всех точек, но вы также можете сохранить их в структуре.

Другие вопросы по тегам