2011-10-03 94 views
0

試圖使3×3矩陣乘法器,但它會給出錯誤的輸出。我不知道我做錯了什麼。我面臨的兩個問題是:程序乘以矩陣

(1)有些變量存儲錯誤的輸入。例如a[1][1]示出了7雖然我進入1

(2)矩陣乘法是錯誤

#include <stdio.h> 
#include <conio.h> 

void matrix_format(int m[2][2]) 
{ 
int i,j; 
printf("\n\n"); 
for(i=0;i<=2;i++) 
{ 
    for(j=0;j<=2;j++) 
    { 
    if(j==0) 
    printf("[ %d |",m[i][j]); 
    else if(j==1) 
    printf(" %d |",m[i][j]); 
    else if(j==2) 
    printf(" %d ] \n",m[i][j]); 
    } 
} 
} 


int main(void) 
{ 
void matrix_format(int [2][2]); 
int a[2][2], b[2][2], r[2][2],m,i,j; 

clrscr(); 

for(m=1;m<=2;m++) 
{ 

    if(m==1) 
    { 
    printf("Enter values for the matrix A \n"); 
    } 
    else 
    { 
    printf("\n\nEnter values for the matrix B \n"); 
    } 

    for(i=0;i<=2;i++) 
    { 
    for(j=0;j<=2;j++) 
    { 
    if(m==1) 
     { 
     printf("A[%d][%d] : ",i+1,j+1); 
     scanf("%d",&a[i][j]); 
     } 
    else if(m==2) 
     { 
     printf("B[%d][%d] : ",i+1,j+1); 
     scanf("%d",&b[i][j]); 
     } 
    } 
    } 
} 

printf("\n Matrix A : \n"); 
matrix_format(a); 

printf("\n Matrix B : \n"); 
matrix_format(b); 

for(i=0;i<=2;i++) 
{ 
    for(j=0;j<=2;j++) 
    { 
    r[i][j]= a[i][j] * b[j][i]; 
    } 
} 

printf("\n Matrix Multiplication Result : \n"); 
matrix_format(r); 

getch(); 
return 0; 
} 

輸出:

enter image description here enter image description here

請引導我。

+0

你做組件明智的乘法而不是什麼我通常稱之爲矩陣乘法,是故意的? – user786653

+0

不,這不是故意的 –

回答

2

即跳出的第一個問題是,所有的數組是2x2的,而他們應該是3×3:

m[2][2] 

應該讀

m[3][3] 

等。括號中的數字是數組的大小,而不是最後一個元素的索引。

這將解釋一些古怪的東西,特別是爲什麼一些元素會被神祕地覆蓋。對於實際的矩陣乘法,你的算法不是很正確(假設你試圖實現的是標準線性代數矩陣乘積)。考慮在兩個矩陣相乘中涉及哪些步驟,以及您的代碼實際在做什麼。由於這是功課,我只給你一個提示:

矩陣產品涉及求和的元素產品

+0

但是所有的數組都以C開頭0 –

+1

@Failed_Noob:正確。但是,當_declaring_數組時,括號內的數字表示數組的所需_size_,而不是數組中的索引。 –

+0

是的,但是在聲明他們的時候,你必須給他們他們**的實際**大小,從1開始。當引用他們的時候,是的,他們從0開始。 – Mxyk

0

首先,請參閱@aix關於數組大小的回答。然後,乘法不起作用的原因是您使用了錯誤的公式。在i中的元件,J在結果矩陣不是I,JJ,I從兩個矩陣乘以簡單的產品 - 相反,每一個在行從左邊矩陣元素i必須從右邊的矩陣乘以j的對應元素,所有產品必須加在一起。見this illustration in the Wikipedia article

1

主要有兩大問題:

首先,一個3×3矩陣是由int matrix[3][3]int matrix[2][2]表示。你看到奇怪結果的原因是你正在寫數組邊界,有效地寫在另一個矩陣上,因爲它們的存儲單元是相鄰的。

:一個陣列,例如int a[10]只能被索引從09

另一個問題是你的乘法。從數學,我們知道,如果我們有:

C = A x B 

然後我們有:

C[i][j] = sum(A[i][k]*A[k][j]) over k 

這是你的情況:

C[i][j] = A[i][0]*A[0][j]+A[i][1]*A[1][j]+A[i][2]*A[2][j] 

所以,你必須有:

for over i 
    for over j 
     C[i][j] = 0 
     for over k 
      C[i][j] += A[i][k]*B[k][j] 
0

你已經定義了2 * 2的數組,它的索引是0,1,但在你的FOR循環中,你試圖接受3行,即一行中的{0,1,2}元素。所以從所有FOR循環中刪除= sign。或者將數組的聲明更改爲[3] [3]。然後應用矩陣乘法的正確公式,即r [0] [0] =(a [0] [0] * b [0] [0]) +(A [0] [1] * b [1] [0])+(A [0] [2] * b [2] [0])。對於其他單元格的第一個單元格,對於3 * 3矩陣的情況。

1

我寫了一個簡單的矩陣乘法程序,而不使用指針。希望這會對你有用。我可以看到你知道如何使用函數,所以請更頻繁地使用它們。你的乘法邏輯也是錯誤的。仔細閱讀,然後看看代碼。 (如果你想做矩陣乘法讓我們說一個5×5矩陣,那麼你應該改變#define SIZE 3#define SIZE 5)。

#include <stdio.h> 
#include <stdlib.h> 

#define SIZE 3 

void CreateMatrix(char name, int m[SIZE][SIZE]) { 
    int row, col; 
    printf("Enter values for the matrix %c:\n", name); 
    for(row = 0; row < SIZE; row++) { 
    for(col = 0; col < SIZE; col++) { 
     printf("%c[%d][%d] : ", name, row + 1, col + 1); 
     scanf("%d", &m[row][col]); 
    } 
    } 
    printf("\n"); 
} 

void PrintMatrix(char name, int m[SIZE][SIZE]) { 
    int row, col; 
    printf("Matrix %c:\n", name); 
    for (row = 0; row < SIZE; row++) { 
    printf("[ "); 
    for (col = 0; col < SIZE; col++) { 
     printf("%d ", m[row][col]); 
    } 
    printf("]\n"); 
    } 
    printf("\n"); 
} 

void MatrixMultiply(int a[SIZE][SIZE], int b[SIZE][SIZE], int mul[SIZE][SIZE]) { 
    int row, col, k; 
    for (row = 0; row < SIZE; row++) { 
    for (col = 0; col < SIZE; col++) { 
     mul[row][col] = 0; 
     for (k = 0; k < SIZE; k++) { 
     mul[row][col] += a[row][k] * b[k][col]; 
     } 
    } 
    } 
} 

int main() { 
    int a[SIZE][SIZE]; 
    int b[SIZE][SIZE]; 
    int mul[SIZE][SIZE]; 

    // Create Matrices 
    CreateMatrix('A', a); 
    CreateMatrix('B', b); 

    // Matrix Multiplication 
    MatrixMultiply(a, b, mul); 

    // Print Matrices 
    PrintMatrix('A', a); 
    PrintMatrix('B', b); 
    PrintMatrix('M', mul); 
} 

輸出:

Enter values for the matrix A: 
A[1][1] : 1 
A[1][2] : 2 
A[1][3] : 3 
A[2][1] : 4 
A[2][2] : 5 
A[2][3] : 6 
A[3][1] : 7 
A[3][2] : 8 
A[3][3] : 9 

Enter values for the matrix B: 
B[1][1] : 1 
B[1][2] : 2 
B[1][3] : 3 
B[2][1] : 4 
B[2][2] : 5 
B[2][3] : 6 
B[3][1] : 7 
B[3][2] : 8 
B[3][3] : 9 

Matrix A: 
[ 1 2 3 ] 
[ 4 5 6 ] 
[ 7 8 9 ] 

Matrix B: 
[ 1 2 3 ] 
[ 4 5 6 ] 
[ 7 8 9 ] 

Matrix M: 
[ 30 36 42 ] 
[ 66 81 96 ] 
[ 102 126 150 ]