2012-04-15 28 views
5

Próbuję rozwiązać problem z mnożeniem macierzy przez C. Wielkości matryc podane w problemie (2x2) Napisałem ten kod, ale nie wydrukowałem wyniku, jak się spodziewam. Myślę, że brakuje mi punktu dotyczącego zasad C.Mnożenie macierzy w C

Jaki jest mój błąd w tym kodzie?

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

Druk Wynik:

2 
3 
4195350 
11 
+0

Dziękuję wszystkim. Ale dlaczego trzy wartości są poprawne, a tylko jedno błędne? (Ta sama wartość jest błędna przez cały czas) –

Odpowiedz

5

Problem polega na tym, że w przewodzie

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

dodawania rzeczy do MATC, ale podczas jego tworzenia, nie ma go zainicjować, a więc ma śmieci.

sould zrobić coś takiego:

int matC[2][2] = {0} który zainicjuje całą matrycę z 0 na

+0

Dziękuję wszystkim. Ale dlaczego trzy wartości są poprawne, a tylko jedno błędne? (Ta sama wartość jest błędna przez cały czas) –

+0

Jest to zależne od implementacji, może mieć dowolną wartość. Fakt, że ma podane wartości, powinien wynikać z używanego kompilatora. – Marco

1

Musisz zainicjować elementów C do zera w pierwszej kolejności.

4

MatC początkowo zawiera niektóre wartości śmieci. Inistatize martix do wszystkich zer. To może rozwiązać Twój problem.

0

Powinieneś zainicjować matC na wszystkie zera.

8

Oto kod mnożenie macierzy używam:

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

wielką rzeczą jest ustawienie macierzy odpowiedzi do zera (tak jak reszta powiedzieć bez kodu).

0

Jeśli rozmiar i zależności nie mają znaczenia Proponuję za pomocą GNU Scientific Library. Zobacz tutaj cech: http://en.wikipedia.org/wiki/GNU_Scientific_Library

zawiera zoptymalizowane procedury dla obliczeń matematycznych i to dość szybko z niektórych optymalizacje kompilatora.

Już z powodzeniem stosuje się do operacji macierzowych w rozwoju 3D.

2

Można mieć mnożenie macierzy danej wielkości przez użytkownika w następujący sposób:

#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

może chcesz dynamicznie przydzielać pamięć powstałej macierzy. Jeśli tak, użyj calloc(), aby przydzielić i wyczyścić elementy. printMatrix() nazywa się , aby wydrukować wynik, ale nie jest tutaj zdefiniowany.

/* 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"); 
} 
Powiązane problemy