Ich weiß nicht, ob ich die Frage richtig verstanden, so werde ich sagen, was ich verstehe:
- Sie haben ein Array einer gegebenen Größe, die eine multidimensionale Matrix darstellt.
- Sie wollen einen 5-dimensionalen Vektor in die reale Position des Arrays konvertieren
ich eine Klasse zuerst schaffen würde es zu kapseln, und ich würde mit 5 Argumenten operator() definiert liefern (std :: size_t , unsigned int oder so). Dieser Operator() sollte zuerst Bereiche überprüfen (vielleicht eine Ausnahme aus, und alle Argumente in die Endposition konvertieren
Simplest Transformation wäre.
size_t position(size_t idx_r, size_t idx_l, size_t idx_rho, size_t idx_alpha, size_t idx_beta)
{
size_t pos = (((((((idx_r * dim_l) + idx_l) * dim_rho) + idx_rho) * dim_alpha) + idx_alpha) * dim_beta) + idx_beta;
return pos;
}
Wo dim_XXX die Größe der Matrix repräsentieren in Dimension XXX.
Wenn Sie viele Operationen ausführen können Sie ohne Änderung die Schnittstelle zu erhalten eine bessere Cache Trefferrate intern die Daten, welche mit einer anderen Reihenfolge zu betrachten.
Der allgemeine Algorithmus konvertiert jeden Index in einer Dimension in das folgende Dimensionselement und fügt den Offset für diese Dimension hinzu. Das einfachste Beispiel ist ein 2-dimensionales System. Um auf Zeile 3 Spalte 2 in einem 10-Spalten-Array zuzugreifen (vorausgesetzt, Sie speichern nach Zeilen und zählen von 1 auf ein Argument), berechnen Sie zuerst den Anfang der dritten Zeile, also 3 * 10 Elemente pro Zeile. Dann fügen Sie den Offset innerhalb der Zeile 2 (Spalte 2) hinzu.
Wenn Sie es auf eine 3-dimensionale Matrix wachsen, zuerst würden Sie die Ebene, die Sie suchen, indem der Ebenenindex durch die Größe der Ebene und dann den vorherigen Algorithmus finden müssen:
size_t position(size_t x, size_t y, size_t z)
{
size_t start_of_plane_z = z * dim_y * dim_x; // z * size_of_plane
size_t start_of_row_y = y * dim_x; // y * size_of_row
size_t offset_inside_row = x;
return start_of_plane_z + start_of_row_y + offset_inside_row;
}
nun einige grundlegende Algebra anwenden Sie die Gleichung in drehen kann:
size_t pos = (((z * dim_y) + y) * dim_x) + x;
dass die Zahl der Multiplikationen reduzieren und einfacher für eine höhere Anzahl von Dimensionen zu definieren.
Five nahm sich die Zeit, um auf null zu antworten. Es war eine Frage, die gut genug war, um sie zu bewerten. Ich mache +1 – Copas