Runden von Matrixelementen



  • Hallo,

    ich benutze <armadillo> für meine arrays und lineare Operatoren.

    Wie kann man die Elemente einer Matrix A(i,j) runden? Nach bisschen googeln bin ich zB auf round() oder ceil() gestoßen. Doch gerundet wird nicht..

    Intuitiv setze ich das A(i,j) in die Klammern: round(A(i,j))

    Was ist alles falsch?

    lg


  • Mod

    round und ceil liefern einen Rückgabewert, verändern das Argument aber nicht.

    Wieso willst du das überhaupt? Das hört sich ziemlich unsinnig an. Willst du vielleicht nur Zwecks einer Ausgabe runden? Das geht einfach mit den entsprechenden Ausgabemethoden (z.B. precision).

    Intuitiv

    Intuitiv geht nicht in der Programmierung. Du musst genau wissen, was du warum wie tust. Lies Referenzen, anstatt zu raten.



  • Jo, es soll zwecks Ausgabe sein

    Letztendlich steht dann da:

    cout << A << setprecision(z.b. 2) << endl;

    Aber offensichtlich wirkt das nicht auf die Matrix gesamt. Wie krieg ich das auf die einzelnen Elemente und lasse es trotzdem die ganze Matrix A ausspucken?

    lg


  • Mod

    ollowain86 schrieb:

    Letztendlich steht dann da:

    cout << A << setprecision(z.b. 2) << endl;

    Aber offensichtlich wirkt das nicht auf die Matrix gesamt. Wie krieg ich das auf die einzelnen Elemente und lasse es trotzdem die ganze Matrix A ausspucken?

    Ist das wieder deine Intuition, dass durch A << setprecision(2) irgendwie die Präzision in die Matrix gesteckt wird? Da sieht man wieder, wohin man mit Intuition kommt, besonders wenn man die Sprache nicht richtig kann.

    Lies Referenzen! Deine Benutzung von setprecision ist falsch. Eigentlich hilft da eine Referenz sogar auch nicht viel, das ist einfach grundlegend gegen die Logik der Sprache C++. Wenn man mal Klammern setzt, wie der gezeigte Ausdruck abgearbeitet wird, steht da:

    (((cout << A) << setprecision(z.b. 2)) << endl);
    

    A wird in den Ausgabestream cout geschrieben*. Dann wird setprecision in den Ausgabestream geschrieben. Dann wird endl in den Ausgabestream geschrieben. Wieso sollte nun der setprecision-Manipulator auf die Ausgabe von A wirken?

    *: Der Rückgabewert dieser Aktion ist wieder cout, sonst würden die folgenden Schritte nicht funktionieren.



  • Also

    cout << A(i,j) << setprecision(2) << endl;

    geht. Ich will nur nicht, dass ich alle Elemente einzel schreiben muss.

    Das,

    cout << A << setprecision(2) << endl;

    nicht geht, war mir bewusst. Ich wollt nur mein Problem erklären.

    Sicherlich hört sich das sehr banal an, wie man nun die Ausgabe aller Matrixelemente meistert, aber ich bin noch sehr ein Neuling was Programmieren angeht.

    Meine Lösung ist es die Zeilen und Spalten einzeln aufzulisten, mit endr und endl, aber bei größeren Matrizen muss es doch eine andere Möglichkeit geben?

    lg


  • Mod

    ollowain86 schrieb:

    mit endr und endl

    Bis jetzt war's ja halbwegs glaubwürdig (auch in deinen anderen Threads, die bloß verdächtig waren), aber jetzt hast du's zu stark übertrieben.



  • SeppJ schrieb:

    ollowain86 schrieb:

    mit endr und endl

    Bis jetzt war's ja halbwegs glaubwürdig (auch in deinen anderen Threads, die bloß verdächtig waren), aber jetzt hast du's zu stark übertrieben.

    Kann ja sein, dass ich etwas falsch verstanden habe aber in dieser Bibliothek scheint es endr wirklich zu geben um diese Euler-artige / Boost-Assignment Initialisierung zu machen:

    http://arma.sourceforge.net/docs.html schrieb:

    umat locations;
    locations << 5 << 9 << endr
              << 6 << 9 << endr;
    
    vec values;
    values << 1.5 << 3.2 << endr;
    
    sp_mat X(locations, values);
    

  • Mod

    asfdlol schrieb:

    SeppJ schrieb:

    ollowain86 schrieb:

    mit endr und endl

    Bis jetzt war's ja halbwegs glaubwürdig (auch in deinen anderen Threads, die bloß verdächtig waren), aber jetzt hast du's zu stark übertrieben.

    Kann ja sein, dass ich etwas falsch verstanden habe aber in dieser Bibliothek scheint es endr wirklich zu geben um diese Euler-artige / Boost-Assignment Initialisierung zu machen:

    Wow, ok. Hätte nicht gedacht, dass jemand in einer ernsthaften Bibliothek Bezeichner wählt, die sich wie ein dummer Witz anhören. Dann meint es der TE wohl doch ernst.


Log in to reply