gsl_matrix



  • Hi, ich möchte zwei Matrizen multiplizieren und das ergebnis in ne dritte Matrix reinschreiben,
    wie mach ich das????

    Da ich so

    gsl_matrix_mul_elements (Matrix2, Matrix3);
    

    zwar die beiden multipilziere....ich möchte allerdings, dass das ergebnis in Matrix1 reingeschrieben wird...

    Danke!

    Lg
    Devil's Daughter



  • Hallo,

    ich hab jetzt schon länger nichts mehr mit der GSL gemacht, aber IIRC bietet sie für dein Anliegen keine Funktion an, also musst du das wohl selber schreiben. Dürfte ja kein Problem sein, kannst nachschauen wie gsl_matrix_mul_elements(gsl_matrix *, gsl_matrix *); implementiert wurde.

    MfG

    GPC



  • Wo kann ich dass nachschauen???

    BIn her noch anfänger, deswegen ist es vermutlich nicht ganz so einfach für mich 😉

    Danke auf jeden Fall!!!!



  • Devil's Daughter schrieb:

    Wo kann ich dass nachschauen???

    Ähem, die GSL ist Open - Source, d.h. jeder kann sich den Quellcode anschauen (soweit nichts neues^^). Da du die GSL aber vermutlich selber kompiliert hast, liegt er bei dir auf der Platte rum. Alles klar?

    MfG

    GPC



  • Danke ja 😉

    Das heißt ich muss eine neue funktion schreiben....

    hab das probiert nur irgendwie klappts nicht ganz....

    könnte das ganze vielleicht auch so funktionieren:
    gsl_matrix_set_all (qsplatdrrProjMatrix, (gsl_matrix_mul_elements (qsplatdrrPerspMatrix, qsplatdrrVolMatrix)));



  • Also ich schaff es irgendwie nicht...eine funktionierende funktion zu schreiben.....
    weiß nicht mal genau wie ich das angehen soll.....

    könnte mir vielleicht jemand helfen??



  • Devil's Daughter schrieb:

    Also ich schaff es irgendwie nicht...eine funktionierende funktion zu schreiben.....
    weiß nicht mal genau wie ich das angehen soll.....

    könnte mir vielleicht jemand helfen??

    ok, der etwas langsamere Weg wäre es, dir ganz normal das Ergebnis der Multiplikation zweiter Matrizen zurückgeben zu lassen und das dann der ersten zuzuweisen:

    m3 = gsl_matrix_mul_elements(m1, m2);
    
    gsl_matrix_memcpy (m1, m3);
    

    Die andere Möglichkeit ist, du schreibst dir den Algo selber, das ist ja nicht schwer, denn in der GSL Manual steht ja:

    This function multiplies the elements of matrix a by the elements of matrix b, a'(i,j) = a(i,j) * b(i,j). The two matrices must have the same dimensions.

    Also kein Problem, denn das Falk'sche Schema wird nicht verwendet (das wäre interessanter 😉 ):

    void special_mul_elements(gsl_matrix *m1, gsl_matrix *m2) {
      //Gleiche Dimension?
      if (m1->size1 != m2->size1 || m1->size2 != m2->size2)
        return;
    
      //Unnötige Berechnungen sparen
      if (gsl_matrix_isnull(m2)) {
        gsl_matrix_set_zero(m1);
        return;
      }
      else if (gsl_matrix_isnull(m1))
       return;
    
      //Eigentliche Berechnung
      double tmp=0;
      for (int i=0;i<m1->size1;++i) {
        for (int j=0;j<m1->size2;++j) {
          tmp = gsl_matrix_get(m1, i, j)*gsl_matrix_get(m2, i, j);
          gsl_matrix_set(m1, i, j, tmp);
        }
      }
    };
    

    Na denn...

    MfG

    GPC



  • Danke...
    super nett von dir 👍



  • Hmm zu dem oberen....mein problem ist ja, dass diese zeile

    m3 = gsl_matrix_mul_elements(m1, m2);
    

    nicht funktioniert......er schreibt hier immer das die variable m3 unused ist.....!!!

    Habs jetzt so geschrieben:

    gsl_matrix* special_mul_elements(gsl_matrix *m1, gsl_matrix *m2, gsl_matrix*m3) {
    
      if (m1->size1 != m2->size1 || m1->size2 != m2->size2)
        return;
    
      if (gsl_matrix_isnull(m2)) {
        gsl_matrix_set_zero(m1);
        return;
      }
      else if (gsl_matrix_isnull(m1))
       return;
    
      double tmp=0;
      for (uint i=0;i<m1->size1;++i) {
        for (uint j=0;j<m1->size2;++j) {
          tmp = gsl_matrix_get(m1, i, j)*gsl_matrix_get(m2, i, j);
          gsl_matrix_set(m3, i, j, tmp);
        }
      }
      return m3;
    }
    

    allerdings gibts da probleme mit den vorigen returns..



  • Das ist nur eine Warnung, weil du noch nichts mit m3 angestellt hast. Deshalb denkt der Compiler: "Hey, das brauch ich nicht, also schmeiß ich ne Warnung."

    Gib m3 mal aus, dann verschwindet auch die Warnung:

    gsl_matrix_fprintf (stdout, m3, "%g");
    

    MfG

    GPC



  • also schreibt er mir das ergebnis der multiplikation eh in m3 hinein.....

    stimmt die variante die ich oben geschrieben hab auch???



  • hm, okay, jetzt hast du einiges geändert. Also gut, die von dir abgeänderte Version von special_mul_elements schreibt in m3 rein, d.h. du musst sie void machen, dann gibt's auch kein Problem mit den returns.

    void special_mul_elements(gsl_matrix *m1, gsl_matrix *m2, gsl_matrix *m3) {
      if (m1->size1 != m2->size1 || m1->size2 != m2->size2)
        return;
    
      //Veränderte Bedingung
      if (gsl_matrix_isnull(m1) || gsl_matrix_isnull(m2)) {
        gsl_matrix_set_zero(m3);
        return;
      }
    
      double tmp=0;
      for (uint i=0;i<m1->size1;++i) {
        for (uint j=0;j<m1->size2;++j) {
          tmp = gsl_matrix_get(m1, i, j)*gsl_matrix_get(m2, i, j);
          gsl_matrix_set(m3, i, j, tmp);
        }
      }
    }
    

    Benutzt du die eingebaute Version, schreibt er zwar auch in m3, aber über einen Rückgabewert. Du hingegen (mit der special Version), schreibst über einen Pointer als Parameter DIREKT in m3 rein.

    Deine Funktion:

    special_mul_elements(m1, m2, m3);
    

    GSL Funktion:

    m3 = gsl_matrix_mul_elements(m1, m2);
    

    Das ist ein fundamentaler Unterschied. Mir scheint, du solltest dich näher mit dem Thema Pointer bzw. Rückgabewerte/Parameter von Funktionen beschäftigen. Im Artikel-Bereich gibt's nen Artikel zu dem Thema ("Pointer in C/C++"), zieh's dir rein.

    MfG

    GPC



  • Ja danke jetzt passt!

    Bin grad dabei mir das Thema anzuschauen....habs nur leider noch nicht ganz durchschaut 😉

    Danke für den Hinweis auf den Artikel!!



  • Eins noch: Ich hab die Bedingung zum Testen auf null noch geändert (und in den vorherigen Post reineditiert). Übernimm die noch, sonst gibt's u.U. falsches Verhalten.

    MfG

    GPC



  • Danke!! 👍


Anmelden zum Antworten