2010-06-09 2 views
5

Ich möchte einige Daten erzeugen, die die Koordinaten einer Wolke von Punkten darstellen, die einen n-Würfel von n Dimensionen darstellen. Diese Punkte sollten gleichmäßig über den gesamten n-Raum verteilt sein und sollten mit einem benutzerdefinierten Abstand zwischen ihnen generiert werden können. Diese Daten werden in einem Array gespeichert.C++ Wie man den Satz des kartesischen Produkts von n-dimensionalen Tupeln erzeugt

+0

ist das Hausaufgaben? – Cetra

+0

nein das ist persönliches Interesse. – Ben

Antwort

2

Ich habe eine Implementierung von cartesian product using Boost.MPL gefunden.

Es gibt auch ein kartesisches Produkt in Boost, aber das ist eine Präprozessor-Anweisung, ich nehme an, dass es für Sie keinen Nutzen hat.

+0

Prost das ist ein etwas nützliches Beispiel für mich zu lesen, obwohl es meine Frage nicht ganz vollständig beantwortet. – Ben

1

Um die Dinge einfach zu halten, hier ist ein Beispiel für einen gewöhnlichen Würfel, dh einen mit 3 Dimensionen. Lassen Sie es Seitenlänge 1 und nehmen Sie an, dass Sie Punkte in Abständen von 1/n haben wollen. (Dies führt zu einer gleichmäßigen rechteckigen Verteilung von Punkten, nicht ganz sicher, dass dies das ist, was Sie wollen).

nun einige Pseudo-Code:

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 

Beachten Sie, dass dies nicht der cartesianischen Produkt von etwas ist, aber scheint (ein Sonderfall) Kriterien zu erfüllen. Wenn Sie die Punkte anders verteilen möchten, passen Sie die Anfangs- und Endindizes der Schleife oder die Intervallgröße an.

Um dies auf eine beliebige höhere Dimension zu verallgemeinern, ist es einfach, weitere Schleifen hinzuzufügen.

Verallgemeinern auf jede höhere Dimension, die bis zur Laufzeit nicht bekannt ist, ist nur etwas schwieriger. Deklarieren Sie anstelle eines N-dimensionalen Arrays ein 1-D-Array mit der gleichen Anzahl an Elementen. Dann müssen Sie die Indexarithmetik explizit schreiben, anstatt sie vom Compiler schreiben zu lassen.

Ich erwarte, dass Sie mir jetzt sagen, dass dies nicht das ist, was Sie wollen! Wenn nicht, kannst du es klären.

+0

Dies ist, was ich will, aber was ich jage ist eine allgemeine Lösung für diese, anstatt eine bestimmte. Dies ist auch, was ich jage. Ein Freund formulierte die Frage für mich neu. Es war schwierig für mich, dies zu erklären, da ich keinen Hintergrund in Geometrie jenseits von 3 Dimensionen habe. – Ben

+0

@Ben: OK, also ist die allgemeine Lösung, dass Sie ein 1-D-Array erstellen, das eine "abgeflachte" Darstellung Ihres N-D-Arrays ist. –

+0

Ich habe mich gefragt, wie man eine n-tiefe Rekursion implementiert, so dass ich einen generischen Weg habe, um die Koordinaten für alle n-Dimensionen zu erzeugen. Eine Funktion, die sich selbst nennt, war eine Art, an die ich dachte, aber das scheint unnötig und unordentlich. – Ben

0

Sie diese rekursiv tun können (Pseudo-Code):

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

} 

Sie nennen es: Hypercube (n, 0, ""); Dadurch werden die Koordinaten aller Punkte gedruckt, aber Sie können sie auch in einer Struktur speichern.

Verwandte Themen