rekursive matrixmultiplikation



  • ich hab seit 2 monaten in der uni c/c++ und wir müssen jede woche ein programm schreiben. ich komm mit dem letzten nich so ganz klar, das problem is die rekursive matrixmultiplikation, rekursiv. 😕 ⚠ ich tipp die komplette aufgabe einfach mal ab.

    es ist eine rekursive funktion zur multiplikation zweier matrizen zu schreiben. es sollen sich dabei ausschließlich um quadratische matrizen handeln, deren dimension eine potenz von 2 sind, also 2 hoch n. in der rekursiven funktion ist für die teilmatrizen speicherplatz dynamisch mit "malloc" anzufordern. vergessen sie nicht diesen auch wieder freizugeben. schreiben sie eine zweite funktion, die zwei matrizen wie "üblich" multipliziert. im hauptprogramm testen sie beide funktionen, geben die ergebnisse übersichtlich aus und vergleichen die ergebnisse zur kontrolle.

    es wäre gut wenn mir jemand helfen könnte. wenn jemand lust hat, kann er auch gleich den ganzen quelltext mitschicken, aber das muss nich sein 😉

    danke!!! 🙄



  • Ich glaube du sollst deine beiden Matrizen aufspalten und nach der folgenden Vorschrift rekursiv rechnen. Dabei ist jeder Buchstabe ein viertel der urpruenglichen Matrix:

    \left( \begin{array}{cc} A & B \\ C & D \end{matrix} \right) \left( \begin{array}{cc} E & F \\ G & H \end{matrix} \right) = \left( \begin{array}{cc} AE+BG & AF+BH \\ CE+DG & CF+DH \end{matrix} \right)

    Mit dem rekursiven Aufruf hörst du auf, wenn die Größe 1 oder ein bestimmter Schwellwert ist.



  • ich geh mal davon aus, das es zur matrix-mult. ebenso einen Rekursiven weg gibt wie zur Berechnung der Determinante...

    Rekursives Berechnen der Det.:

    http://ifgivor.uni-muenster.de/vorlesungen/Geostatistik/kap/kap_08/k08_1.htm

    [Noch ein Edit] Aber zum Glück ist es ja DEINE Hausaufgabe 😃



  • ich kann dir ml meine matrix multiplikation geben, kannst vielleicht was damit anfangen oder teilweise benutzen

    // Matrizenrechnungen
    #include <iostream>
    #include <stdlib.h>
    #include <iomanip>
    
    using namespace std;
    
    class Matrix
    {
     private: int n, m;
              double** matrix;
    
    public: 
    
    Matrix(int ndim, int mdim)
     {
      n=ndim;
      m=mdim;
      matrix = new double* [n+1];
      for(int i=1; i<n+1; i++)
      {
       matrix[i]=new double[m+1];
      }
     }
    
    Matrix(const Matrix& i)
     {
       n=i.n;
       m=i.m;
       matrix = new double* [n+1];
       for(int k=1; k<n+1; k++)
       {
           matrix[k]=new double[m+1];
       }
    
       for(int h=1; h<n+1; h++)
       {
          for(int j=1; j<m+1; j++)
          {
                matrix[h][j]=i.matrix[h][j];
          }
       }
     }
    
    ~Matrix()
    { 
      for(int i=1; i<n; i++)
       {
         delete matrix[i];
       }
      delete [] matrix;
     }
    
    Matrix operator + (Matrix i)
     {
    
      if(n!=i.n || m!=i.m)
      {
       cout << "Die Matrixdimensionen stimmen nicht ueberein, daher keine Addition moeglich." << endl;
       Matrix result = Matrix::Matrix(0,0);
       return result;
      }
      else
      {
       Matrix erg = Matrix::Matrix(n, m);
       for(int h=1; h<n+1; h++)
       {
          for(int j=1; j<m+1; j++)
          {
             erg.matrix[h][j]=matrix[h][j] + i.matrix[h][j];
          }
       }
       return erg;
      }
     }
    
     Matrix operator * (Matrix i)
     {
       if(m!=i.n)
       {
          cout << "Die Matrixdimensionen stimmen nicht ueberein, daher keine Maultiplikation moegöich." << endl;
          Matrix result = Matrix::Matrix(0, 0);
          return result; 
       }
       Matrix erg = Matrix::Matrix(n, i.m);
       for(int h=1; h<n+1; h++)
       {
          for(int j=1; j<i.m+1; j++)
          {
                erg.matrix [h][j] = 0;
                for(int k=1; k<n+1; k++)
                {
                       erg.matrix[h][j]+=matrix[h][k]*i.matrix[k][j];
                }
          }
       }  
       return erg; 
     }
    
     Matrix transp()
     {
        Matrix erg = Matrix::Matrix(m, n);
        for(int h=1; h<m+1; h++)
        {
            for(int j=1; j<n+1; j++)
            {
                  erg.matrix[h][j] = matrix[j][h];
            }
        }
        return erg;
     }
    
     Matrix operator = (Matrix i)
     {
       Matrix erg = Matrix::Matrix(i);
       return erg;
     }
    
     friend istream& operator >> (istream& i, Matrix& ma);
     friend ostream& operator << (ostream& o, Matrix& ma);
    
    };
    
     istream& operator >> (istream& i, Matrix& ma)
     {
      for(int h=1; h<ma.n+1; h++)
       for(int j=1; j<ma.m+1; j++)
        i >> ma.matrix[h][j];
      return i;
     }
     ostream& operator << (ostream& o, Matrix& ma)
     {
      if(ma.n==0 && ma.m==0)cout << "Matrixdimension ist Null." <<endl;
      for(int h=1; h<ma.n+1; h++)
      {
       for(int j=1; j<ma.m+1; j++)
      	o << setw(6)<< ma.matrix[h][j];
    
       cout <<endl;
      }
    
      return o;
     }
    
    int main(int argc, char *argv[])
    {
    int n,m;
    
    cout << "Bitte den Zeilenindex von Matrix 1 eingeben: ";
    cin >> n;
    cout << "Bitte den Spaltenindex von Matrix 1 eingeben: ";
    cin >> m;
    
    Matrix matrix1 = Matrix::Matrix(n, m);
    
    cout << "Bitte den Zeilenindex von Matrix 2 eingeben: ";
    cin >> n;
    cout << "Bitte den Spaltenindex von Matrix 2 eingeben: ";
    cin >> m;
    Matrix matrix2 = Matrix::Matrix(n, m);
    
    cout << "Matrix 1 eingeben: ";
    cin >> matrix1;
    cout << "Matrix 2 eingeben: ";
    cin >> matrix2;
    
    cout << matrix1 << endl;
    cout << matrix2 << endl;
    
    Matrix plus=matrix1+matrix2;
    Matrix mal=matrix1*matrix2;
    Matrix trans=matrix1.transp();
    
    cout << "Plus:" << endl << plus << endl;
    cout << "Mal:" << endl << mal << endl;
    cout << "Transponiert:" << endl << trans <<endl;
    
      return 0;
    }
    

Anmelden zum Antworten