2010-06-09 217 views
5

Deseo generar algunos datos que representen las coordenadas de una nube de puntos que representan un n-cubo de n dimensiones. Estos puntos deben estar distribuidos uniformemente en el n-espacio y deben poder generarse con un espaciado definido por el usuario entre ellos. Esta información se almacenará en una matriz.C++ Cómo generar el conjunto de productos cartesianos de tuplas n-dimensionales

+0

es esta tarea? – Cetra

+0

no, esto es de interés personal. – Ben

Respuesta

2

He encontrado una implementación de cartesian product using Boost.MPL.

También hay un producto cartesiano real en Boost pero es una directiva de preprocesador, supongo que no sirve para usted.

+0

Saludos que es un ejemplo útil para mí, aunque no responde completamente mi pregunta. – Ben

1

Para simplificar, aquí hay un ejemplo para un cubo ordinario, es decir, uno con 3 dimensiones. Deje que tenga una longitud lateral 1 y suponga que desea puntos espaciados a intervalos de 1/n. (Esto está llevando a una distribución rectangular uniforme de puntos, no del todo segura de que esto es lo que desea).

Ahora algunos pseudo-código:

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 

Tenga en cuenta que este no es el producto cartesiano de nada, pero parece satisfacer (un caso especial de) sus criterios. Si desea que los puntos estén espaciados de manera diferente, ajuste los índices de inicio y final del ciclo o el tamaño del intervalo.

Para generalizar esto en cualquier dimensión superior especificada es fácil, agregue más bucles.

Para generalizar a cualquier dimensión superior que no se conoce hasta el tiempo de ejecución es sólo un poco más difícil. En lugar de declarar una matriz N-dimensional, declare una matriz 1-D con la misma cantidad de elementos. Luego debe escribir la aritmética de índice explícitamente en lugar de tener que escribirlo por usted.

¡Espero que ahora me diga que esto no es lo que quiere! Si no es así, puedes aclarar.

+0

Esto es lo que quiero, pero lo que estoy buscando es una solución general a esto, en lugar de una específica. Esto también es lo que estoy persiguiendo. Un amigo reformuló la pregunta para mí. Fue difícil explicarlo ya que no tengo ninguna formación en geometría más allá de 3 dimensiones. – Ben

+0

@Ben: OK, entonces la solución general es que usted cree una matriz 1-D que es una representación 'aplanada' de su matriz N-D. –

+0

Me preguntaba cómo implementar la recursión de n profundidad, así que tengo una forma genérica de generar las coordenadas para todas las n dimensiones. Tener una función que se llama a sí misma fue una de las formas en que pensé, pero esto parece innecesario y complicado. – Ben

0

Usted puede hacer esto de forma recursiva (pseudocódigo):

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

} 

usted lo llama: Hypercube (n, 0, ""); Esto imprimirá las coordenadas de todos los puntos, pero también puede almacenarlos en una estructura.

Cuestiones relacionadas