程序乘以矩阵

时间:2011-10-03 16:25:05

标签: 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++)
   {
    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

请指导我。

5 个答案:

答案 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]等数组只能从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]

答案 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矩阵。