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
risposta
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.
Cheers è un esempio un po 'utile per me leggere, anche se non risponde completamente alla mia domanda. – Ben
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.
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
@ Ben: OK, quindi la soluzione generale è che si crea un array 1-D che è una rappresentazione "appiattita" del proprio array N-D. –
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
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.
è questo compito? – Cetra
no, questo è un interesse personale. – Ben