[C/C++] Dynamische Matrixmultiplikation mit Arrays

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Manyl, 19. Mai 2008 .

Schlagworte:
  1. 19. Mai 2008
    Dynamische Matrixmultiplikation mit Arrays

    Hallöle!

    Ich hab mal aufgegeben...wir sollen in der Schule ne Matrixmultiplikation schreiben. Sprich man schriebt in ein mehrdimensionales Array die ersten Werte, in die zweite die weztein und die werden dann multipliziert...

    naja, klingt eig nich so schwer, aber ich bin am verzweifeln...


    Ich hatte eine Variante programmiert in dem die Arrays als MatrixA[Zeilen*Spalten] angegeben war...bis mir aufgefallen ist...das is gar nich mehrdimensional....also hab ich veruscht das ganze als MatrixA[Zeilen][Spalten] zu machen, wobei Zeilen und Spalten in ner Abfrage vorher festgelegt wurden Problem ist, das er mir jetzt immer sagt, das die Feldgrenze nicht undefiniert sein darf. Dabei hab ich die Matrix als new int MatrixA[???][???] angegeben, also so, das er sich den SPeicher selbst zulegen soll.

    Ich hab echt keine Ahnung mehr....hat wer zufällig ne Lösung für das Problem oder vielleicht nen funktionierenden Programmcode? ich will den nicht klauen, nur das Problem gelöst bekommen...
     
  2. 19. Mai 2008
    AW: Dynamische Matrixmultiplikation mit Arrays

    du solltest dich erstmal schlau machen wie man 2 matrizen miteinander mulipliziert, unterschiedlicher größe.. such mal nach dem Falk-Schema
    dann musst du dich übelst damit beschäftigen bis du hinter den algorithmus steigst.

    hab dir mal was in java geschrieben, damit dus nicht so einfach hast das nach c/c++
    zu protieren *g*
    Code:
     //gegeben sind matrixa[][] und matrixb[][] welche schon befüllt wurden
     //matrixp hat das ergebniss
     int[][] matrixp = new int[matrixa.length][matrixb[0].length];
     int summe=0;
     for(int i=0; i<matrixa.length; i++){
     for( int j=0; j<matrixb[0].length; j++){
     for(int k=0; k<matrixa[0].length; k++){
     summe = summe + matrixa[i][k]*matrixb[k][j];
     matrixp[i][j]=summe;
     }
     summe=0;
     }
     }
     
  3. 19. Mai 2008
    Zuletzt von einem Moderator bearbeitet: 14. April 2017
    AW: Dynamische Matrixmultiplikation mit Arrays

    Ok, hab dir schnell was compiled. Code hab ich im Netz gefunden^^

    No File | xup.in

    Weiß nicht, ob es 100%ig das is, was du brauchst

    Hier die Source:
    Code:
    #include<iostream.h>
    #include<conio.h>
    
    int main(int argc, char* argv[])
    {
    
    // Decleration //
    
     int a[3][3],b[3][3],c[3][3],d=0,i=0,j=0,k=0;
    
     clrscr();
    
    // Inputes //
    
     cout<<"Please enter the first matrix\n\n";
    
     for(i=0;i<3;i++)
     {
     for(j=0;j<3;j++)
     {
     cin>>a[i][j];
     }
     }
    
     cout<<"\nPlease enter the second matrix\n\n";
     for(i=0;i<3;i++)
     {
     for(j=0;j<3;j++)
     {
     cin>>b[i][j];
     }
     }
    
    // Logic //
    
     cout<<"\n\nThe logic of progam is \n\n";
    
     for(i=0;i<3;i++)
     {
     for(j=0;j<3;j++)
     {
     for(k=0;k<3;k++)
     {
     d=d+(a[j][k]*b[k][j]);
     cout<<(a[j][k]*b[k][j]);
     if(k<2)
     {
     cout<<"+";
     }
     }
     c[i][j]=d;
     d=0;
     cout<<" ";
     }
     cout<<"\n";
     }
    
    // Resualt //
    
     cout<<"\n\nThe resualt of matrix multiplication is \n\n";
     for(i=0;i<3;i++)
     {
     for(j=0;j<3;j++)
     {
     cout<<" "<<c[i][j];
     }
     cout<<"\n";
     }
    
     getch();
     return 0;
    }
    //edit: gebe zu, dass der algo nich so easy zu verstehen is. Hab auch so 20 mins gebraucht...
     
  4. 22. Mai 2008
    AW: Dynamische Matrixmultiplikation mit Arrays

    ich muss die ersten Matrizen DYNAMISCH erstellen, das ist dsa problem....

    also die größe der jeweiligen matrix wird erst dadurch bestimmt, das der user sagt, es soll 3 zeilen und 2 spalte sein oder sowas


    da kommt immer das feldgrenzen problem....der restliche algorithmus is mir klar, nur das dynamische erstellen einer multidimensionalen matrix als array geht nich...
     
  5. 22. Mai 2008
    AW: Dynamische Matrixmultiplikation mit Arrays

    Probier's mal mit malloc.
    Somit erstellst du dir zur Laufzeit ein 2D-Array.

    Code:
    // Erstellt dir ein Array der Dimension N*M
    // M: Zeilen
    // N: Spalten (oder anderst herum? *unsicher*)
    
    int** a = (int**) malloc( M * sizeof(int*) );
    int i = 0;
    for (i = 0; i < M; i++)
     a[i] = (int*) malloc( N * sizeof(int) );
    
    Zuerst hast du deinen Pointer auf Pointer. Beim ersten Aufruf von malloc erstellst du dir dann deine Pointer auf integer. Danach musst du nur noch die Integer allozieren.

    - - -
    tanya
     
  6. 22. Mai 2008
    AW: Dynamische Matrixmultiplikation mit Arrays

    allokierung:
    Code:
     int *matA, *matB, *matOut, mColA = 3, mLinA = 3, mColB = 3, mLinB = 3;
     int i,j;
     matA = (int*) malloc(mColA*mLinA*sizeof(int)); /*allocate space for the matrix*/
     matB = (int*) malloc(mColB*mLinB*sizeof(int)); /*allocate space for the matrix*/
    
    multiplikation:

    Code:
    int MatMul(int *matA, int mLinA, int mColA, int *matB, int mLinB, int mColB, int* matC, int mLinC, int mColC)
    {
     int i,j,k, valA = 0, valB = 0, valC = 0;;
     
     if (mColA == mLinB)
     {
     for (i = 0; i < mLinC; i++)
     {
     for(j = 0; j < mColC; j++)
     {
     *((int*) matC+i*mColC+j)=0; /*init matrix c*/ 
     for(k = 0; k < mColA; k++)
     {
     valA = *((int*) matA+i*mColA+k); /*value of this column/row*/
     valB = *((int*) matB+k*mColB+j);
     *((int*) matC+i*mColC+j) += (valA * valB); /*Add A[i,k] * B[k,j] to C[i,j]*/
     }/*for*/ 
     }/*for*/
     }/*for*/
     return 1;
     }/*if*/
     else
     {
     printf("Error: Columns from matrix A are different to lines of matrix B - returning!\n");
     return 0;
     }/*else*/ 
    }/*MatMul*/
    
    
    viel spaß =)
     
  7. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.