Я хочу генерировать некоторые данные, которые представляют координаты облака точек, представляющих n-куб n размеров. Эти точки должны быть равномерно распределены всюду по n-пространству и должны смочь быть сгенерированными с пользовательским интервалом между ними. Эти данные будут храниться в массиве.
Я нашел реализацию картезианского произведения с помощью 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-мерный массив, объявите одномерный массив с тем же количеством элементов. Тогда вам придется писать индексную арифметику явно, а не поручать компилятору писать ее за вас.
Я ожидаю, что сейчас вы скажете мне, что это не то, что вы хотите! Если это не так, не могли бы вы пояснить.
Вы можете сделать это рекурсивно (псевдокод):
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, ""); Это напечатает координаты всех точек, но вы также можете сохранить их в структуре.