尝试制作3 x 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;
}
输出:
请指导我。
答案 0 :(得分:2)
跳出来的第一个问题是你的所有数组都是2x2,而它们应该是3x3:
m[2][2]
应该阅读
m[3][3]
等等。括号中的数字是数组的大小,而不是最后一个元素的索引。
这将解释一些奇怪的东西,特别是为什么有些元素会被神秘地覆盖。
对于实际的矩阵乘法,您的算法不太正确(假设您要实现的是标准线性代数矩阵乘积)。想想在两个矩阵相乘时涉及哪些步骤,以及您的代码实际在做什么。由于这是家庭作业,我只会给你一个提示:
Matrix产品涉及元素产品的总结。
答案 1 :(得分:1)
有两个主要问题:
首先,3 * 3矩阵由int matrix[3][3]
而非int matrix[2][2]
表示。你看到奇怪结果的原因是你正在写数组边界,有效地写在另一个矩阵上,因为它们的内存位置是相邻的。
注意:int a[10]
等数组只能从0
到9
编入索引。
另一个问题是你的乘法。从数学,我们知道如果我们有:
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]
答案 2 :(得分:1)
我编写了一个简单的矩阵乘法程序而不使用指针。希望这对你有用。我可以看到你知道如何使用函数,所以尝试更频繁地使用它们。你的乘法逻辑也错了。阅读,然后查看代码。 (如果你想做一个5 x 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 ]
答案 3 :(得分:0)
首先,请参阅@aix关于数组大小的答案。然后,乘法不起作用的原因是你使用了错误的公式。结果矩阵中 i,j 的元素不仅仅是 i,j 和 j的乘积,i 来自两个矩阵的乘积 - 相反,左矩阵中行 i 中的每个元素必须乘以右矩阵中 j 列中的对应元素,并且所有产品必须加在一起。请参阅this illustration in the Wikipedia article。
答案 4 :(得分:0)
你已经定义了2 * 2的数组,即它的索引为0,1。但是在你的FOR循环中,你试图在一行中接受3个即{0,1,2}个元素。所以从所有FOR循环中删除=符号。或者只是将数组的声明更改为[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矩阵。