row major order umsortieren in column major order



  • Hallo!

    Gibt es einen Algorithmus, der es mir erlaubt arrays, die in row major order gespeichert sind in column major order umzusortieren?
    Ich möchte während der umsortierung nicht einen extra bufferarray der selben größe im speicher anlegen, da die daten sehr groß sind. Meine version funktioniert bis jetzt nur so. Das ganze sollte in C/C++ gehalten sein.

    mfg
    hoppel55



  • Hmm? Wenn du zwei Indizes hast, dann reicht es doch denke ich a[i][j] und a[j][i] zu tauschen, mit 0 <= i < n und 0 <= j < i (quasi transponieren).

    for (int i = 0; i < n; ++i)
        for (int j = 0; j < i; ++j)
             std::swap (a[i][j], a[j][i];
    

    Wenns nicht quadratisch ist, dann berechne den eigentlichen Index.



  • Ich hab vergessen zu sagen, dass es eine dreidimensionale matrix ist. ich mach das schon so, dass ich den index direkt berechne, mit einer for-schleife. D.h. ich lese die Daten in einen linearen array ein und berechne aus dem row major index den zugehörigen column major index. mein problem ist nur, dass es sich um 1024^3 float arrays handelt und ich für den column major array einen neuen array im speicher anlege. ich suche nach einem algorithmus, der mir die sortierung direkt auf dem alten row major array durchführt.

    Gruß
    hoppel55



  • Ist doch aber immer noch dasselbe, oder, nur halt mit 3 Dimensionen.
    Also

    float* a = ...
    for (unsigned x = 0; x < 1024; x++)
        for (unsigned y = 0; y < 1024; y++)
            for (unsigned z = x; z < 1024; z++)
                std::swap(a[(x * 1024 + y) * 1024 + z], a[(z * 1024 + y) * 1024 + x]);
    

    zumindest wenn ich mich jetzt nicht ganz irre 🙂


Anmelden zum Antworten