2011-10-03 95 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 ]