Matrizen-Transponierungs-Implentierung



  • EOutOfResources schrieb:

    volkard schrieb:

    Das Semikolon nach der Funktion ist falsch.

    Eisflamme schrieb:

    ist doch nie falsch, es ist lediglich optional.

    Quelle.

    Trotzdem ist es falsch. Da hat halt Eisflamme unrecht.

    EOutOfResources schrieb:

    volkard schrieb:

    So viel % ist so viel lahm.

    Gut, werde ich in eine Variable stopfen.

    Finde doch mal raus, was verschachtelten Schleifen sind.

    EOutOfResources schrieb:

    volkard schrieb:

    Das (void) klingt nach einem urururalten C++-Buch.

    Wieso? Nur weil es überflüssig ist? Vieles ist überflüssig und wird trotzdem noch eingesetzt.

    Aber so wird man Dich nie ernst nehmen.



  • volkard schrieb:

    Trotzdem ist es falsch. Da hat halt Eisflamme unrecht.

    OK. Werde ich fixen.

    volkard schrieb:

    Finde doch mal raus, was verschachtelten Schleifen sind.

    Weiss ich. Was hat das damit zu tun? Meinst du wegen der Implementierung des Modulo-Operators?

    volkard schrieb:

    Aber so wird man Dich nie ernst nehmen.

    Grund?



  • Forkst du grade mein Projekt? 😛



  • Scorcher24 schrieb:

    Forkst du grade mein Projekt? 😛

    Keine Ahnung was "forken" heisst.



  • EOutOfResources schrieb:

    volkard schrieb:

    Finde doch mal raus, was verschachtelten Schleifen sind.

    Weiss ich. Was hat das damit zu tun? Meinst du wegen der Implementierung des Modulo-Operators?

    Weil Du zwei Variablen in eine steckst und mit % die beiden wieder extrahierst, was erstens eine Schnapsidee ist, und zweitens das if erst notwendig macht.

    EOutOfResources schrieb:

    volkard schrieb:

    Aber so wird man Dich nie ernst nehmen.

    Grund?

    Offen vorgetragene Lernresistenz.



  • volkard schrieb:

    Weil Du zwei Variablen in eine steckst und mit % die beiden wieder extrahierst, was erstens eine Schnapsidee ist, und zweitens das if erst notwendig macht.

    Aha, jetzt verstehe ich, was du meinst. Das if ist immer noch nötig, da ich sonst alles doppelt swapen würde.



  • EOutOfResources schrieb:

    volkard schrieb:

    Weil Du zwei Variablen in eine steckst und mit % die beiden wieder extrahierst, was erstens eine Schnapsidee ist, und zweitens das if erst notwendig macht.

    Aha, jetzt verstehe ich, was du meinst. Das if ist immer noch nötig, da ich sonst alles doppelt swapen würde.

    Außer, Du denkst kurz über die innere Laufbedingung nach.



  • volkard schrieb:

    Außer, Du denkst kurz über die innere Laufbedingung nach.

    Den Satz verstehe ich überhaupt nicht.



  • EOutOfResources schrieb:

    volkard schrieb:

    Außer, Du denkst kurz über die innere Laufbedingung nach.

    Den Satz verstehe ich überhaupt nicht.

    Vorher:

    for(int y=1;y!=4;++y)
      for(int x=1;x!=4;++x)
        if(x<y)
          cout<<y<<' '<<x<<'\n';
    

    Nachher:

    for(int y=1;y!=4;++y)
      for(int x=1;x!=y;++x)
        cout<<y<<' '<<x<<'\n';
    


  • EDIT: Unterschied nicht bemerkt. Peinlich...



  • Dann vergleich doch mal die Endbedingung von volkard mit deinem Code - siehst du den Unterschied zwischen "x!=4" und "x!=y"?



  • CStoll schrieb:

    Dann vergleich doch mal die Endbedingung von volkard mit deinem Code - siehst du den Unterschied zwischen "x!=4" und "x!=y"?

    Oh mann. Habe ich übersehen. Ich nehmen alles zurück.



  • in-place transponieren...

    wenn ich so etwas schon sehe, da dreht es mir doch die Fussnägel hoch. Vor allem wenn es nur um die mickrige Dimension 4x4 geht.



  • nur mal so kurz ins Blaue:
    wenn dein Array ordentlich aussehen würde, könntest du das so schreiben:

    for(unsigned int i = 0; i < Side-1; i++)
        for(unsigned int j = i+1; j < Side; i++)
            std::swap(Array[i][j], Array[j][i]);
    

    Die Diagonalelemente werden ausgespart und wir laufen nur über die obere Dreiecksmatrix.

    nun bestehst du auf Indexfrickelei und es wird hässlich

    for(unsigned int i = 0; i < Side-1; i++)
        for(unsigned int j = i+1; j < Side; i++)
            std::swap(Array[Side*i+j], Array[Side*j+i]);
    

    ich schätze man kann da noch lustig die indizes optimieren. Aber das kann der Compiler wahrscheinlich besser...

    //edit und ich sehe gerade, dass dein Code gar nicht macht, was er soll

    std::swap(this->Array[i % this->Side], this->Array[i - i % this->Side]);
    

    Side ist 4. i geht von 0 bis Side*Side. Also 16. i %Side ist also: 0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3. das erste Argument deines Swaps ist also nur die erste Zeile/Spalte deiner Matrix.


Anmelden zum Antworten