2010-06-09 13 views
5

Desidero generare alcuni dati che rappresentano le coordinate di una nuvola di punti che rappresentano un n-cubo di n dimensioni. Questi punti dovrebbero essere equamente distribuiti in tutto lo spazio n e dovrebbero essere generati con una spaziatura definita dall'utente tra loro. Questi dati saranno memorizzati in una matrice.C++ Come generare il set di prodotti cartesiani di tuple n-dimensionali

+0

è questo compito? – Cetra

+0

no, questo è un interesse personale. – Ben

risposta

2

Ho trovato un'implementazione di cartesian product using Boost.MPL.

V'è un prodotto cartesiano reale Boost pure ma che è una direttiva del preprocessore, suppongo che è di alcuna utilità per voi.

+0

Cheers è un esempio un po 'utile per me leggere, anche se non risponde completamente alla mia domanda. – Ben

1

Per semplificare le cose, ecco un esempio per un cubo ordinario, ovvero uno con 3 dimensioni. Lascia che abbia una lunghezza laterale 1 e supponi di volere punti distanziati a intervalli di 1/n. (Questo sta portando ad una distribuzione rettangolare uniforme dei punti, non del tutto certo che questo sia ciò che vuoi).

Ora alcuni pseudo-codice:

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 

Nota che questo non è il prodotto cartesiano di qualsiasi cosa, ma sembra soddisfare (un caso speciale) i suoi criteri. Se si desidera che i punti siano distribuiti in modo diverso, regolare gli indici di inizio e fine del ciclo o le dimensioni dell'intervallo.

Per generalizzare questo a qualsiasi dimensione superiore specificata è facile, aggiungere più loop.

Per generalizzare a qualsiasi dimensione superiore che non è nota fino a quando il tempo di esecuzione è solo leggermente più difficile. Invece di dichiarare un array N-dimensionale, dichiarare un array 1-D con lo stesso numero di elementi. Quindi devi scrivere l'aritmetica dell'indice in modo esplicito invece di scrivere il compilatore per te.

Mi aspetto che ora mi dirai che non è quello che vuoi! Se non lo si potrebbe chiarire.

+0

Questo è quello che voglio ma quello che sto inseguendo è una soluzione generale a questo, piuttosto che a uno specifico. Questo è anche quello che sto inseguendo. Un amico ha riformulato la domanda per me. È stato difficile spiegarlo perché non ho alcun background in geometria oltre le 3 dimensioni. – Ben

+0

@ Ben: OK, quindi la soluzione generale è che si crea un array 1-D che è una rappresentazione "appiattita" del proprio array N-D. –

+0

Mi chiedevo come implementare la ricorsione in profondità n, anche se ho un modo generico per generare le coordinate per tutte le n-dimensioni. Avere una funzione che si chiama era un modo in cui pensavo, ma questo sembra non necessario e disordinato. – Ben

0

Si può fare questo in modo ricorsivo (pseudocodice):

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

} 

si chiamano: Hypercube (n, 0, ""); Questo stamperà le coordinate di tutti i punti, ma puoi anche memorizzarli in una struttura.

Problemi correlati