Matrix Zeilen und Spalten vertauschen



  • Hey,

    ich habe eine Variable char matrix[128] und möchte jede Zeile mit der Spalte tauschen. Wie kann man das am einfachsten bewerkstelligen, wenn man kein Mehrdimensionales Array hat? Ich komme vom Denken her einfach nicht darauf 😞

    Danke 🙂



  • Ich nehme an du hast deine Matrix, du willst deine Matrix so hier im Array abspeichern:

    matrix[0] matrix[1] matrix[2] matrix[3] ...
    matrix[zeilenlänge +0] matrix[zeilenlänge +1] ...
    matrix[2*zeilenlänge +0] ...

    dann wäre also zum beispiel matrix[i*zeilenlänge + j] der eintrag in der i-ten Zeile und j-ten Spalte (bei 0 anfangen zu zählen!)

    du möchtest ja daraus wohl das die einträge an der Diagonalen gespiegelt werden (man nennt das transponieren).
    Der Eintrag (i,j) muss dazu in (j,i) gespeichert werden, das geht dann am übersichtlichsten so:

    char temp;
    for (int i=0; i<Zeilenzahl;i++)
        for(int j=0; j<=i;j++) {
            temp=matrix[i*zeilenlänge+j];
            matrix[i*zeilenlänge+j]=matrix[j*zeilenlänge+i]
            matrix[j*zeilenlänge+i]=temp;
        }
    

    Gruß,
    Wilhelm



  • Mixy schrieb:

    ich habe eine Variable char matrix[128] und möchte jede Zeile mit der Spalte tauschen. Wie kann man das am einfachsten bewerkstelligen, wenn man kein Mehrdimensionales Array hat? Ich komme vom Denken her einfach nicht darauf 😞

    Du brauchst eine gleiche Anzahl an Spalten und Zeilen, um die Matrix zu transponieren. Das ist bei einer Grösse von 128 offensichtlich nicht möglich. Schreib dir am besten eine Konstante:

    const unsigned int size = 16; // für 256 Einträge
    

    Ich nehme an, du hast eine Funktion, die dir das Element an bestimmten Indizes zurückliefert? Ansonsten kannst du ja kaum sinnvoll mit der Matrix arbeiten.

    char& at(char* matrix, unsigned int y, unsigned int x);
    

    Sobald du sowas hast, wird es nicht mehr schwierig. Und mach den Dreieckstausch nicht wie chillhelm von Hand, schliesslich haben wir Tauschfunktionen in der Standardbibliothek.

    #include <algorithm>
    
    void transpose(char* matrix)
    {
        for (unsigned int y = 0; y < size; ++y)
        {
            for (unsigned int x = 0; x < size; ++x)
            {
                std::swap(at(matrix,y,x), at(matrix,x,y));
            }
        }
    }
    

  • Mod

    Nexus schrieb:

    void transpose(char* matrix)
    {
        for (unsigned int y = 0; y < size; ++y)
        {
            for (unsigned int x = 0; x < size; ++x)
            {
                std::swap(at(matrix,y,x), at(matrix,x,y));
            }
        }
    }
    

    hübsch. Diese Funktion tut allerdings gar nichts 😉



  • camper schrieb:

    hübsch. Diese Funktion tut allerdings gar nichts 😉

    Hast Recht. Wäre noch klug, nicht gleich wieder zurückzutauschen. 🙂

    Das kann der Threadersteller sicher selbst implementieren.


Anmelden zum Antworten