Frage zur For-Schleife



  • Hallo,

    Also folgendes Problem:

    Ich habe zwei Matrizen, und möchte diese multiplizieren. Das mache ich natürlich am besten mit einer for-Schleife. Denn ohne for-Schleife bekommt man das zwar auch sehr einfach hin (da die Matrizengröße [eine 4x3 und die andere 3x4 groß] vorgegeben ist), aber das ist ja nicht der Sinn der Sache.

    kleines Beispiel wie die zweite Zeile bei mir momentan aussehen würde

    D[1][0]= B[1][0]*A[0][0]+B[1][1]*A[1][0]+B[1][2]*A[2][0];
     D[1][1]= B[1][0]*A[0][1]+B[1][1]*A[1][1]+B[1][2]*A[2][1];
     D[1][2]= B[1][0]*A[0][2]+B[1][1]*A[1][2]+B[1][2]*A[2][2];
     D[1][3]= B[1][0]*A[0][3]+B[1][1]*A[1][3]+B[1][2]*A[2][3];
    

    So, nun will ich aber anfangen, das ganze in eine for-Schleife zu packen.

    Dann dachte ich mir müsste das für die Zweite Zeile vermutlich irgendwie so aussehen:

    for(l, m ,n;   l<3, m<3, n<3    ;l++, m++, n++)
    D[1][l]+=B[1][m]*A[n][m]
    

    Aber so funktioniert das dann wohl doch nicht ganz... aber ich hab kein plan wie ich das machen soll 😞 Muss ich das doch vielleicht in (in dem fall) 3 getrennte forschleifen machen? Wie mache ich das mit der Addition und Multiplikation, oder geht das dann doch nicht so einfach, und ich muss eine zwischenvariable einfügen`?

    Vielen Dank für eure hilfe schonmal,

    gruß kenti



  • kenti schrieb:

    for(l, m ,n;   l<3, m<3, n<3    ;l++, m++, n++)
    

    Dies ist absolut identisch mit Folgendem Code:

    for (; n < 3; l++, m++, n++)
    

    Lies in deinem Buch mal den , Operator nach.

    Du benötigst 3 getrennte For-Schleifen.



  • Ja der Kommaoperator ist doch ein Listenoperator, ich dachte, das würde in der for-schleife gehen, dass man mehrere variablen initialisiert und inkrementiert, zumindest habe ich es so schon in programmierbeispielen gesehen. Naja jetzt habe ich daraus zwar 3 forschleifen gemacht, bekomme aber immer nur segmentation fault (core dumped).

    for(spalte=0;spalte<3;spalte++)
       {
         for(m=0;m<3;m++)
           for(n=0;n<3;n++)
    	 { 
    	    D[0][spalte] += (B[0][l]*A[m][0]);
    	 }
       }
    

    So, was machen diese Schleifen nun eigentlich?

    Ich bin der Meinung, sie würden folgendes machen:

    1. für spalte wird 0 eingesetzt sowie eine 0 fürs l und eine 0 fürs m
    2. spalte bleibt immernoch auf 0, l wird 1 gesetzt und m auch 1
    3. spalte bleibt immernoch auf 0, l wird 2 gesetzt und m auch 2
    4. spalte wird auf 1 gesetzt, l wird 0 gesetzt und m auch 0
    usw. bis:
    x. spalte bleibt auf 2, l wird 2 gesetzt, m wird auch 2 gesetzt.

    So nun: Was macht das ganze aber?

    Beispiel für 1.:

    MatD[0][0] = B[0][0]*A[0][0]+B[0][1]*A[1][0]+B[0][2]*A[2][0]

    Oder ist das anderst? Sollte ich nochmal den Operator += genauer anschauen? Stimmt zumindest die Idee der For-Schleife jetzt? Stimmt die Idee, dass ich nach der for(m=0;m<3;m++) keine geschweifte Klammer aufmache weil ich möchte, dass beide gleichzeitig laufen? Würde ich eine aufmachen würde ja erst die eine hochzählen und danach die andere, richtig?

    Danke für die hilfe,

    gruß kenti



  • Nein, die Klammerung bewirkt nicht, dass zwei for-schleifen parallel ihren Wert ändern - dies ist nie der Fall. Das ist nur so erreichtbar, wie es Janjan gezeigt hat.
    Jede Schleife läuft ihren Bereich ab. In Deinem Beispiel wird spalte auf 0 gesetzt, die Bedingung den Folgeblock zu behandeln ist erfüllt, also geht es in diesem Block los - und dort ist die zweite Schleife. Gleiches nun hier, und auch für die dritte Schleife. spalte, m und n stehen also auf 0 wenn die += - Zuweisung das erste Mal behandelt wird. Soweit ist es Dir ja auch klar.

    Danach geht es in die n-loop zurück, und n wird erhöht. Da dieser Block aber noch nicht beendet wird, interessiert das die m-Schleife gar nicht. Hierhin wird erst zurückgesprungen, wenn n den Wert 3 erreicht hat, und aus diesem Grund die n-Schleife beendet wird. Damit ist dieser Block beendet und m wird inkrementiert.
    Es ist noch kleiner als 3, also wird der innere Block wieder ausgeführt, und n startet wieder mit 0.

    Die Reihenfolge ist folglich:

    spalte=0 m=0 n=0 Formel
                 n=1 Formel
                 n=2 Formel
                 n=3 Abbruch, keine Formel!
             m=1 n=0 Formel
                 n=1 Formel
                 n=2 Formel
                 n=3 Abbruch, keine Formel!
             m=2 n=0 Formel
                 n=1 Formel
                 n=2 Formel
                 n=3 Abbruch, keine Formel!
             m=3 Abbruch
    spalte=1 m=0 n=0 Formel
     ...
    spalte=2 m=2 n=3 Abbruch, keine Formel!
             m=3 Abbruch
    spalte=3 Abbruch
    es geht weiter nach diesem Bereich
    


  • Ok, danke, soweit ist mir das nun klar. Vielleicht stell ich mich ja auch nur sehr blöd an, aber dann bräuchte ich doch eigentlich nur 2 for-schleifen, oder?

    Und zwar so:

    for(spalte=0;spalte<3;spalte++)
       {
       for(m=0;m<3;m++)
         {
    	 MatD[0][spalte] += (MatB[0][m]*MatA[m][0]);  
         }
       }
    

    Für die 1. Spalte funktioniert das ganze auch, aber die 2. und 4. Spalte bringen Werte nahe der unendlichkeit, und für die 3. Spalte bekomme ich den selben wert wie für die 1. Spalte 😞
    Stell ich mich wirklich so dumm an, oder ist das für ein totalen anfänger wirklich keine so einfache sache? Das ist ein Grundkurs für C und wir sind jetzt in der 5. Woche, ich frage mich, wie ich jemals die Prüfung schaffen soll, wenn ich schon jetzt solche Probleme habe 😞

    gruß kenti



  • ok, ich sollte erst denken dann schreiben, eigentlich müsste ich für alle 4 spalten den selben wert rausbekommen mit der formel, oder? 🙂



  • for(spalte=0;spalte<3;spalte++)
       {
       for(m=0;m<3;m++)
         {
         MatD[0][spalte] += (MatB[0][m]*MatA[m][0]);  
         }
       }
    

    So soll das natürlich wenn schon denn schon aussehen, aber selbes Problem, die zweite und vierte spalte spinnen 😞
    Die erste und dritte spalte stimmen aber zumindest 🙂



  • und ich glaub ich geh besser wieder ins bett, jetzt bin ich sogar noch zu dumm um einfach copy&paste anzuwenden 😞 😞 😞 sorry vielmals für den spam

    for(spalte=0;spalte<3;spalte++)
    {
    for(m=0;m<3;m++)
    {
    MatD[0][spalte] += (MatB[0][m]*MatA[m][spalte]);
    }
    }



  • kenti schrieb:

    Ok, danke, soweit ist mir das nun klar. Vielleicht stell ich mich ja auch nur sehr blöd an, aber dann bräuchte ich doch eigentlich nur 2 for-schleifen, oder?

    Wie willst du dann die Zeilen der Ergebinsmatrix voll bekommen?

    Matrix A[4][3] = {0}, B[3][4] = {0}, C[4][4] = {0};
    	int i, j, k;
    	for ( i = 0; i < 4; i++ )
    		for ( j = 0; j < 3; j++ )
    			for ( k = 0; k < 4; k++ )
    				C[i][k] += A[i][j] * B[j][k];
    


  • Ja aber wie gesagt gings mir jetzt ja erstmal nur um eine einzelne Zeile, denn wenn ich schon die einzelne Zeile nicht hinbekomme, wie soll es dann mit der kompletten matrize funktionieren? 😉

    ok ich glaube mein cygwin ist defekt, funzt nun eigentlich alles so wie es soll, außer dass er bei ein paar einträgen werte nahe der unendlichkeit herholt, en kollege hats bei sich compiliert und es ging ganz normal, also muss da bei mir wohl iwas futsch sein 😞



  • kenti schrieb:

    und ich glaub ich geh besser wieder ins bett, jetzt bin ich sogar noch zu dumm um einfach copy&paste anzuwenden 😞 😞 😞 sorry vielmals für den spam

    for(spalte=0;spalte<3;spalte++)
    {
    for(m=0;m<3;m++)
    {
    MatD[0][spalte] += (MatB[0][m]*MatA[m][spalte]);
    }
    }

    Hier sind die Grenzen der Indizes falsch. Bei einer 3x4 bzw. 4x3 Matrix muss ein Index von 0 bis 2, der andere von 0 bis 3 laufen.

    kenti schrieb:

    ok ich glaube mein cygwin ist defekt,

    Das glaube ich nicht. :p



  • wiegeht das nu mit matrix 😕



  • ehm da bin ich mir aber sehr wohl sicher das mein cygwin nicht mehr geht, denn wieso sollte es beim kollegen das programm kompilieren und richtige werte ausspucken und bei mir kommen spanische werte?



  • kenti- schrieb:

    ehm da bin ich mir aber sehr wohl sicher das mein cygwin nicht mehr geht, denn wieso sollte es beim kollegen das programm kompilieren und richtige werte ausspucken und bei mir kommen spanische werte?

    Hat Spanien nicht auch das Dezimalsystem? 😕
    Und ok, wenn du sicher bist, das es an cygwin liegt, dann benutze etwas anderes.
    Ansonsten würde ich vorschlagen:
    Da i.d.R. eine Matrixmultiplikation nicht allzu viele Codezeilen beinhaltet, würde man vermutlich relativ schnell herausfinden, ob ein logischer oder ein anderer Fehler infrage kommt, wenn du die vollständige Multiplikation posten würdest.



  • wiegeht schrieb:

    wiegeht das nu mit matrix 😕

    So kanns gehen, Bruder, guckst du Code ganz unten:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-261615-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html
    Habe ich übrigens mit der Suchfunktion gefunden 😉



  • Hallo Community,
    ich stelle mir gerade die Frage, ob man Bedingung einer Schleife auch variabel halten kann oder muss ich dafür "else if" bzw. eine "case" Anweisung nehmen?
    Hab mir das ungefähr so gedacht: Es wird in einer If-schleife überprüft, ob etwas eintritt.

    Wenn ja, dann wird bedingung="x<y"; ausgegeben.
    Wenn nein, dann wird bedingung="x>y"; ausgegeben.
    Wobei bedingung z.B.

    char bedingung[4];
    

    Somit könnte man eine andere Schleife ansteuern:

    if (bedingung){...}
    

    Ist so etwas möglich?

    Gruß Dragon


Log in to reply