2012-04-15 19 views
5

Sto cercando di risolvere un problema di moltiplicazione di matrice con C. Dimensioni della matrice date nel problema (2x2) Ho scritto questo codice ma non stampa il risultato come previsto. Penso che mi manchi un punto sulle regole di C.Moltiplicazione matrice in C

Qual è il mio errore in questo codice?

#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]); 
     } 
    } 
} 

del risultato di stampa:

2 
3 
4195350 
11 
+0

Grazie a tutti. Ma perché tre valori sono corretti e uno solo sbagliato? (Lo stesso valore è sempre sbagliato) –

risposta

5

Il problema è che nella linea

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

si sta aggiungendo cose da MATC, ma quando lo si crea, non si inizializzare, quindi ha spazzatura.

Si sould fare qualcosa di simile:

int matC[2][2] = {0} che inizializzare tutte la matrice con 0 di

+0

Grazie a tutti. Ma perché tre valori sono corretti e uno solo sbagliato? (Lo stesso valore è sempre sbagliato) –

+0

È dipendente dall'implementazione, può avere qualsiasi valore .. Il fatto che abbia i valori che dici dovrebbe essere dovuto al compilatore che stai utilizzando. – Marco

1

È necessario inizializzare gli elementi di C a zero prima.

4

matC inizialmente contiene alcuni valori obsoleti. Iniatializzare la martix a tutti gli zeri. Questo potrebbe risolvere il tuo problema

0

È necessario inizializzare matC per tutti gli zeri.

8

Ecco il codice moltiplicazione matriciale che uso:

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]; 
     } 
    } 
} 

cosa grande è l'impostazione della matrice risposta a zero (come del resto hanno detto senza codice).

0

Se la dimensione e le dipendenze non contano Io suggerirei di usare la libreria GNU Scientific. Vedere qui per caratteristiche: http://en.wikipedia.org/wiki/GNU_Scientific_Library

Esso contiene routine ottimizzate per i calcoli matematici ed è abbastanza veloce con alcune ottimizzazioni del compilatore.

Già utilizzato con successo per operazioni con matrici nello sviluppo 3D.

2

È possibile avere moltiplicazione matriciale di qualsiasi dimensione dall'utente nel modo seguente:

#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

Si consiglia di allocare dinamicamente la memoria per la matrice risultante. In tal caso, utilizzare calloc() per allocare e cancellare gli elementi. printMatrix() si chiama per stampare il risultato, ma non definito qui.

/* 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"); 
} 
Problemi correlati