Программа для умножения матрицы

#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("nn");
 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("nnEnter 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",amp;a[i][j]);
      }
     else if(m==2)
      {
       printf("B[%d][%d] : ",i 1,j 1);
       scanf("%d",amp;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;
}
  

вывод:

введите описание изображения здесь
введите описание изображения здесь

Пожалуйста, направьте меня.

Комментарии:

1. Вы делаете компонентное умножение, а не то, что я обычно называю матричным умножением, это специально?

Ответ №1:

Первая проблема, которая возникает, заключается в том, что все ваши массивы имеют размер 2×2, в то время как они должны быть 3×3:

 m[2][2]
  

следует прочитать

 m[3][3]
  

и так далее. Число в скобках — это размер массива, а не индекс последнего элемента.

Это объяснит некоторые странности, в частности, почему некоторые элементы таинственным образом перезаписываются.

Что касается фактического умножения матрицы, ваш алгоритм не совсем правильный (предполагая, что то, что вы пытаетесь реализовать, является стандартным матричным продуктом линейной алгебры). Подумайте о том, какие шаги требуются для умножения двух матриц и что на самом деле делает ваш код. Поскольку это домашнее задание, я дам вам только подсказку:

Произведение матрицы включает в себя суммирование произведений элементов.

Комментарии:

1. Но все массивы начинаются с 0 в C

2. @Failed_Noob: Правильно. Однако при объявлении массивов число в скобках представляет желаемый размер массива, а не индекс в массиве.

3. Да, но при их объявлении вы должны указать их фактический размер, начиная с 1. При обращении к ним, тогда да, они начинаются с 0.

Ответ №2:

Есть две основные проблемы:

Во-первых, матрица 3 * 3 представлена int matrix[3][3] символом not 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:

Я написал простую программу умножения матрицы без использования указателей. Надеюсь, это сработает для вас. Я вижу, что вы знаете, как использовать функции, поэтому старайтесь использовать их чаще. Также ваша логика умножения была неправильной. Прочитайте об этом, а затем посмотрите код. (Если вы хотите выполнить умножение матрицы, скажем, для матрицы 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", amp;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 ]
  

Ответ №4:

Во-первых, см. Ответ @aix относительно размеров массива. Тогда причина, по которой умножение не работает, заключается в том, что вы используете неправильную формулу. Элемент в i, j в результирующей матрице не является просто произведением i, j и j, i из двух умножаемых матриц — вместо этого каждый элемент в строке i из левой матрицы должен быть умножен на соответствующий элемент из столбца j из правой матрицы, и все произведениядолжны быть добавлены вместе. Смотрите эту иллюстрацию в статье Википедии.

Ответ №5:

у вас есть определенный массив размером 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.