C 矩阵乘法程序
试图制作3 x 3矩阵乘法器,但输出错误。我不知道我做错了什么。我面临的两个问题是: (1) 有些变量存储错误的输入。例如,C 矩阵乘法程序,c,C,试图制作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
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;
}
#包括
#包括
void矩阵_格式(int m[2][2])
{
int i,j;
printf(“\n\n”);
对于(i=0;i而言,跳出的第一个问题是所有数组都是2x2,而它们应该是3x3:
m[2][2]
应该读
m[3][3]
以此类推。括号中的数字是数组的大小,而不是最后一个元素的索引
这将解释一些奇怪之处,特别是为什么某些元素会被神秘地覆盖
至于实际的矩阵乘法,您的算法不太正确(假设您尝试实现的是标准线性代数矩阵积)。请思考两个矩阵乘法涉及哪些步骤,以及您的代码实际在做什么。因为这是家庭作业,我只给您一个提示:
矩阵积包括元素积的总和
出现的第一个问题是,所有阵列都是2x2,而它们应该是3x3:
m[2][2]
应该读
m[3][3]
以此类推。括号中的数字是数组的大小,而不是最后一个元素的索引
这将解释一些奇怪之处,特别是为什么某些元素会被神秘地覆盖
至于实际的矩阵乘法,您的算法不太正确(假设您尝试实现的是标准线性代数矩阵积)。请思考两个矩阵乘法涉及哪些步骤,以及您的代码实际在做什么。因为这是家庭作业,我只给您一个提示:
矩阵积包括元素积的总和
首先,请参阅@aix关于数组大小的回答。然后,乘法不起作用的原因是您使用了错误的公式。结果矩阵中i,j处的元素不仅仅是两个矩阵中i,j和j,i的乘积,而是左矩阵中i行中的每个元素都必须乘以corr与右矩阵j列中的元素相对应,所有乘积必须相加。请参阅。首先,请参阅@aix关于数组大小的回答。然后,乘法不起作用的原因是您使用了错误的公式。结果矩阵中i,j处的元素不仅仅是两个ma的i,j和j,i的乘积三次相乘-相反,左矩阵第i行中的每个元素必须与右矩阵第j列中的相应元素相乘,所有乘积必须相加。请参见。存在两个主要问题:
首先,一个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]
有两个主要问题:
首先,一个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*2的数组,即它的索引为0,1。但是在FOR循环中,您试图在一行中接受3个元素,即{0,1,2}。因此,从所有FOR循环中删除=符号。或者只是将数组的声明更改为[3][3]。也可以应用正确的矩阵乘法公式,即r[0][0]=(a[0][0]*b[0])+(a[0][1]*b[1+]a[0][2][0])。对于第一个单元格,对于其他单元格也是如此,在3*3矩阵的情况下。您定义了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矩阵。我编写了一个不使用指针的简单矩阵乘法程序。希望这对您有用。我可以看出您知道如何使用函数,所以请尝试更频繁地使用它们。此外,您的乘法逻辑是错误的。请仔细阅读,然后查看代码。(如果要对5 x 5的矩阵进行矩阵乘法,则只需将#定义大小3
更改为#定义大小5
)
我写了一个简单的矩阵乘法程序,不使用指针。希望这对你有用。我可以看出你知道如何使用函数,所以试着更频繁地使用它们。而且你的乘法逻辑是错误的。请仔细阅读,然后看代码。(如果要对5 x 5的矩阵进行矩阵乘法,则只需将#定义大小3
更改为#定义大小5
)
但所有数组都以0开头C@Failed_Noob:正确。但是,在声明数组时,括号内的数字表示所需的数组大小,而不是数组中的索引。是的,但在声明数组时,必须给出它们的实际大小