2dim Array zu 1dim Array



  • Hallo,

    ich habe ein float[4][4] und moechte das konvertieren in ein float[16]. Was ist da die schnellste Variante?



  • MatrixHack schrieb:

    Hallo,

    ich habe ein float[4][4] und moechte das konvertieren in ein float[16]. Was ist da die schnellste Variante?

    float packed[4][4];
    float * linearized = &packed[0][0];
    

    Dann hast Du allerdings kein float[16] , sondern ein float* . Sollte es ein float[16] sein müssen, dann musst Du kopieren.



  • Ist denn garantiert, dass das float[16] linear im Speicher liegt?
    Quasi, dass es diese Struktur hat:
    [0][0], [0][1], [0][2], [0][3], [1][0], [1][1], ...
    ?



  • oder mit einer doppelten for-Schleife:

    int counter = 0;
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            newFloat[counter] = oldFloat[i][j];
            counter++;
        }
    }
    

    Macht im Grunde genommen keinen Unterschied im Bezug auf die Geschwindigkeit. Hast nur mehr Zeilen Code.


  • Mod

    MatrixHack schrieb:

    Hallo,

    ich habe ein float[4][4] und moechte das konvertieren in ein float[16]. Was ist da die schnellste Variante?

    float x[4][4];
    float (&y)[16] = reinterpret_cast<float(&)[16]>( x );
    

    Und ja, das Ganze ist wohldefiniert.



  • camper schrieb:

    MatrixHack schrieb:

    Hallo,

    ich habe ein float[4][4] und moechte das konvertieren in ein float[16]. Was ist da die schnellste Variante?

    float x[4][4];
    float (&y)[16] = reinterpret_cast<float(&)[16]>( x );
    

    Und ja, das Ganze ist wohldefiniert.

    Wieso das & Zeichen?



  • also referenz auf das 4x4 array
    ---> alles was du im [16]-array änderst, hat auch wirkung auf das 4x4 array


  • Mod

    MatrixHack schrieb:

    camper schrieb:

    MatrixHack schrieb:

    Hallo,

    ich habe ein float[4][4] und moechte das konvertieren in ein float[16]. Was ist da die schnellste Variante?

    float x[4][4];
    float (&y)[16] = reinterpret_cast<float(&)[16]>( x );
    

    Und ja, das Ganze ist wohldefiniert.

    Wieso das & Zeichen?

    Die schnellste Variante ist nunmal, gar nichts zu tun, und einfach nur eine Referenz auf das ursprüngliche ARray zu verwenden.



  • camper schrieb:

    MatrixHack schrieb:

    camper schrieb:

    MatrixHack schrieb:

    Hallo,

    ich habe ein float[4][4] und moechte das konvertieren in ein float[16]. Was ist da die schnellste Variante?

    float x[4][4];
    float (&y)[16] = reinterpret_cast<float(&)[16]>( x );
    

    Und ja, das Ganze ist wohldefiniert.

    Wieso das & Zeichen?

    Die schnellste Variante ist nunmal, gar nichts zu tun, und einfach nur eine Referenz auf das ursprüngliche ARray zu verwenden.

    Das selbe haette ich doch auch hiermit:
    float * linearized = &packed[0][0];

    Ein float* waere fuer mich genauso ok wie float[16].



  • das größte problem bei all dem (sowohl referenz als auch pointer) ists sowieso, dass der flaschenhals die lebensdauer des 4x4 array ist...


Anmelden zum Antworten