2010-06-09 3 views
5

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

+0

Это домашнее задание? – Cetra

+0

нет это личный интерес. – Ben

ответ

2

Я нашел реализацию cartesian product using Boost.MPL.

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

+0

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

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

+0

Это то, что я хочу, но то, что я преследую, - это общее решение, а не конкретное. Это то, что я преследую. Друг перефразировал вопрос для меня. Мне было сложно объяснить, потому что у меня нет фона в геометрии за пределами трех измерений. – Ben

+0

@Ben: Хорошо, поэтому общее решение заключается в том, что вы создаете массив с 1-D, который является «сплющенным» представлением вашего массива N-D. –

+0

Мне было интересно, как реализовать 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); 
    } 

} 

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