C 矩阵乘法程序

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

试图制作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;
}
#包括
#包括
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:正确。但是,在声明数组时,括号内的数字表示所需的数组大小,而不是数组中的索引。是的,但在声明数组时,必须给出它们的实际大小