2012-04-15 11 views
5

Ich versuche, ein Matrix-Multiplikationsproblem mit C zu lösen. Matrixgrößen in Problem angegeben (2x2) Ich schrieb diesen Code, aber es druckt nicht Ergebnis, wie ich es erwarte. Ich denke, ich vermisse einen Punkt über Regeln von C.Matrix Multiplikation In C

Was ist mein Fehler in diesem Code?

#include <stdio.h> 
int main() { 
    int matA[2][2]={0,1,2,3}; 
    int matB[2][2]={0,1,2,3}; 
    int matC[2][2]; 
    int i, j, k; 
    for (i = 0; i < 2; i++) { 
     for(j = 0; j < 2; j++) { 
      for(k = 0; k < 2; k++) { 
       matC[i][j] += matA[i][k] * matB[k][j]; 
      } 
      printf("%d\n",matC[i][j]); 
     } 
    } 
} 

Printing Ergebnis:

2 
3 
4195350 
11 
+0

Vielen Dank. Aber warum sind drei Werte richtig, dann ist nur einer falsch? (Derselbe Wert ist die ganze Zeit falsch) –

Antwort

5

Das Problem ist, dass in der Leitung

matC[i][j] += matA[i][k] * matB[k][j]; 

Sie die Dinge zu matC hinzufügen, aber wenn Sie es schaffen, Sie es nicht initialisiert werden, so dass es Müll hat.

Sie sould so etwas wie:

int matC[2][2] = {0}, die mit 0 der ganzen Matrix initialisiert wird

+0

Vielen Dank. Aber warum sind drei Werte richtig, dann ist nur einer falsch? (Der gleiche Wert ist immer falsch) –

+0

Es ist abhängig von der Implementierung, es kann einen beliebigen Wert haben. Die Tatsache, dass es die Werte hat, die Sie sagen, sollte wegen des Compilers sein, den Sie verwenden. – Marco

1

Sie müssen Elemente der C initialisieren zuerst auf Null.

4

matC enthält anfänglich einige Garbage-Werte. Initialisieren Sie den Martix auf alle Nullen. Dies könnte Ihr Problem lösen

0

Sie sollten matC auf alle Nullen initialisieren. Hier

8

ist der Matrixmultiplikation Code verwende ich:

for(i=0;i<M;i++){ 
    for(j=0;j<K;j++){ 
     matC[i][j]=0; 
     for(k=0;k<N;k++){ 
      matC[i][j]+=matA[i][k]*matB[k][j]; 
     } 
    } 
} 

große Sache ist die Antwort Matrix auf Null gesetzt werden (wie auch der Rest ohne Code gesagt hat).

0

Wenn Größe und Abhängigkeiten ich die GNU Scientific Library verwenden würde vorschlagen, keine Rolle spielen. Siehe hier für Funktionen: http://en.wikipedia.org/wiki/GNU_Scientific_Library

Es enthält optimierte Routinen für mathematische Berechnungen und ist ziemlich schnell mit einigen Compiler-Optimierungen.

Bereits erfolgreich für Matrixoperationen in 3D-Entwicklung verwendet.

2

Sie können Matrixmultiplikation von einem bestimmten Größe durch den Benutzer auf die folgende Weise haben:

#include<stdio.h> 
void main() 
{ 
    int r1, c1, r2, c2; 

    printf("Enter number of rows and columns for matrix A : "); 
    scanf("%d %d",&r1,&c1); 

    printf("Enter number of rows and columns for matrix B : "); 
    scanf("%d %d",&r2,&c2); 

    int a[r1][c1], b[r2][c2], ab[r1][c2], ba[r2][c1],i,j,k,temp; 

    if(c1==r2 && r1==c2) 
    { 
     printf("\nEnter element in matrix A : "); 
     for(i=0;i<r1;i++) 
     { 
      for(j=0;j<c1;j++) 
      { 
       printf("\n Enter element : "); 
       scanf("%d",&a[i][j]); 
      } 
     } 
     printf("\nEnter element in B : "); 
     for(i=0;i<r2;i++) 
     { 
      for(j=0;j<c2;j++) 
      { 
       printf("\nEnter element : "); 
       scanf("%d",&b[i][j]); 
      } 
     } 
     for(i=0;i<r1;i++) 
     { 
      for(j=0;j<c2;j++) 
      { 
       temp=0; 
       for(k=0;k<r2;k++) 
       { 
        temp+=a[i][k]*b[j][k]; 
       } 
       ab[i][j]=temp; 
      } 
     } 
     for(i=0;i<r2;i++) 
     { 
      for(j=0;j<c1;j++) 
      { 
       temp=0; 
       for(k=0;k<r1;k++) 
       { 
        temp+=b[i][k]*a[k][j]; 
       } 
       ba[i][j]=temp; 
      } 
     } 
     printf("\nMatrix A : "); 
     for(i=0;i<r1;i++) 
     { 
      printf("\n\t"); 
      for(j=0;j<c1;j++) 
      { 
       printf("%d",a[i][j]); 
      } 
      printf("\n"); 
     } 
     printf("\nMatrix B : "); 
     for(i=0;i<r2;i++) 
     { 
      printf("\n\t"); 
      for(j=0;j<c2;j++) 
      { 
       printf("%d",b[i][j]); 
      } 
     } 
     printf("\nMatrix multiplication of A*B : "); 
     for(i=0;i<r1;i++) 
     { 
      printf("\n\t"); 
      for(j=0;j<c2;j++) 
      { 
       printf("\t%d",ab[i][j]); 
      } 
      printf("\n"); 
     } 
     printf("\nMatrix multiplication of B*A : "); 
     for(i=0;i<r2;i++) 
     { 
      printf("\n\t"); 
      for(j=0;j<c1;j++) 
      { 
       printf("\t%d",ba[i][j]); 
      } 
      printf("\n"); 
     } 
    } 
    else 
     printf("\nMatrix Multiplication is not possible...!!!"); 
} 
0

Möglicherweise möchten Sie Speicher für die resultierende Matrix dynamisch zuzuweisen. Wenn ja, verwenden Sie calloc(), um die Elemente zuzuordnen und zu löschen. printMatrix() heißt , um das Ergebnis zu drucken, aber hier nicht definiert.

/* matrix1: [rows1 x cols1]; matrix2: [rows2 x cols2]; product is 
matrix3: [rows1 x cols2] if (cols1 == rows2) is true. calloc to 
allocate/clear memory for matrix3. Algorithm is O(n^3) */ 

float ** matrix3; 
if (cols1 == rows2) { // product matrix can be calculated 
    // calloc product matrix3 
    matrix3 = (float **)calloc(rows1, sizeof(float *)); 
    for (int i = 0; i < rows1; i++) 
     matrix3[i] = (float *)calloc(cols2, sizeof(float)); 

    int i, j, k; 
    float tmp; 
    for (i = 0; i < rows1; i++) { 
     for (j = 0; j < cols2; j++) { 
      tmp = 0.0; 
      for (k = 0; k < rows2; k++) 
       tmp += matrix1[i][k] * matrix2[k][j]; 
      matrix3[i][j] = tmp; 
     } 
    } 
    printMatrix(matrix3, rows1, cols2, 3); 
    free(matrix3); 
} else { // cols1 != rows2 
    puts("dimensional mismatch; can't multiply matrices"); 
}