2012-04-15 10 views
5

Estoy tratando de resolver un problema de multiplicación de matriz con C. Tamaños de matriz dados en el problema (2x2) Escribí este código pero no imprime el resultado como esperaba. Creo que me falta un punto sobre las reglas de C.Multiplicación de matriz En C

¿Cuál es mi error en este código?

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

resultado de la impresión:

2 
3 
4195350 
11 
+0

Thank You All. Pero ¿por qué tres valores son correctos y solo uno está equivocado? (El mismo valor está mal todo el tiempo) –

Respuesta

5

El problema es que en la línea

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

va a añadir cosas a MATC, pero cuando lo cree, no inicializarlo, por lo que tiene la basura.

Usted sould hacer algo como:

int matC[2][2] = {0} que inicializar toda la matriz con de 0

+0

Gracias a todos. Pero ¿por qué tres valores son correctos y solo uno está equivocado? (El mismo valor está mal todo el tiempo) –

+0

Depende de la implementación, puede tener cualquier valor ... El hecho de que tenga los valores que usted dice debe ser debido al compilador que está utilizando. – Marco

1

Debe inicializar elementos de C a cero en primer lugar.

4

matC inicialmente contiene algunos valores basura. Iniatialize el martix a todos los ceros. Esto podría resolver su problema

0

Debe inicializar matC en todos los ceros.

8

Aquí está el código de multiplicación de matrices que utilizo:

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

gran cosa se está poniendo la matriz de respuesta a cero (como el resto ha dicho, no hay código).

0

Si el tamaño y las dependencias no importan Se recomienda usar la Biblioteca Científica GNU. Vea aquí para las características: http://en.wikipedia.org/wiki/GNU_Scientific_Library

Contiene rutinas optimizadas para cálculos matemáticos y es bastante rápido con algunas optimizaciones del compilador.

Ya lo usé exitosamente para operaciones de matriz en Desarrollo 3D.

2

Usted puede tener la multiplicación de matrices de cualquier tamaño dado por el usuario de la siguiente manera:

#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

Es posible que desee asignar dinámicamente la memoria para la matriz resultante. De ser así, use calloc() para asignar y borrar los elementos. printMatrix() se llama para imprimir el resultado, pero no se define aquí.

/* 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"); 
} 
Cuestiones relacionadas