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

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

5
задан Ben 9 June 2010 в 08:12
поделиться

3 ответа

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

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

2
ответ дан 15 December 2019 в 06:16
поделиться

Для упрощения приведем пример для обычного куба, т.е. имеющего 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
ответ дан 15 December 2019 в 06:16
поделиться

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

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

0
ответ дан 15 December 2019 в 06:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: