Умножение матриц на C

CBeginner
Практиковаться сейчас

Введение

В этом лабораторном задании мы напишем программу умножения матриц на языке C. Мы узнаем, как создавать матрицу, выполнять операции с матрицами и обсудить стандартный алгоритм умножения матриц. Мы создадим C-программу для умножения двух матриц и выведем результирующую матрицу.

Примечание: вам нужно самостоятельно создать файл ~/project/main.c, чтобы практиковаться в написании кода и узнать, как компилировать и запускать его с использованием gcc.

cd ~/project
## создать main.c
touch main.c
## скомпилировать main.c
gcc main.c -o main
## запустить main
./main

Создание матриц

Сначала давайте научимся создавать матрицы. Матрица - это двухмерный массив. Вот пример того, как объявить и инициализировать матрицу 2x2 на языке C:

int matrix[2][2] = {{1, 2}, {3, 4}};

Мы можем обращаться к конкретным элементам матрицы с использованием двух индексов, как в следующем примере:

int element = matrix[1][0];

Умножение матрицы на скаляр

Умножение матрицы на одно значение простой операцией и выполняется следующим образом:

int arr[2][2], n;
//Введите скалярное значение
scanf("%d", &n);

//Введите элементы матрицы
for(int i = 0; i < 2; i++) {
    for(int j = 0; j < 2; j++){
        scanf("%d", &arr[i][j]);
    }
}
//Умножьте каждый элемент матрицы на скалярное значение
for(int i = 0; i < 2; i++) {
    for(int j = 0; j < 2; j++){
        arr[i][j] = arr[i][j] * n;
    }
}

//Выведите обновленные элементы матрицы
for(int i = 0; i < 2; i++) {
    for(int j = 0; j < 2; j++){
        printf("%d ", arr[i][j]);
    }
    printf("\n");
}

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

Умножение двух матриц

Для умножения двух матриц необходимо следовать определенным правилам. Во - первых, количество столбцов первой матрицы должно быть равно количеству строк второй матрицы. Во - вторых, результирующая матрица будет иметь такое же количество строк, как и первая матрица, и такое же количество столбцов, как и вторая матрица.

Предположим, у нас есть две матрицы:

A = {{1, 3, 5},
     {4, 2, 6}};

B = {{7, 4},
     {3, 1},
     {6, 9}};

Для умножения этих двух матриц мы будем выполнять скалярное произведение их строк и столбцов. Элементы матриц умножаются по следующей формуле:

result[row][col] = matrix1[row][0] * matrix2[0][col]
                  + matrix1[row][1] * matrix2[1][col]
                  + matrix1[row][2] * matrix2[2][col]
                  +...;

Ниже представлена C - программа для умножения матриц:

#include <stdio.h>

int main()
{
  int m, n, p, q, c, d, k, sum = 0;

  // определяем две матрицы
  int first[10][10], second[10][10], result[10][10];

  // вводим количество строк и столбцов первой матрицы
  printf("Enter the number of rows and columns of the first matrix:\n");
  scanf("%d %d", &m, &n);

  // вводим элементы первой матрицы
  printf("Enter the %d elements of the first matrix:\n", m * n);
  for (c = 0; c < m; c++) {
    for (d = 0; d < n; d++) {
      scanf("%d", &first[c][d]);
    }
  }

  // вводим количество строк и столбцов второй матрицы
  printf("Enter the number of rows and columns of the second matrix:\n");
  scanf("%d %d", &p, &q);

  // вводим элементы второй матрицы
  printf("Enter the %d elements of the second matrix:\n", p * q);
  for (c = 0; c < p; c++) {
    for (d = 0; d < q; d++) {
      scanf("%d", &second[c][d]);
    }
  }

  // проверяем, можно ли умножать матрицы
  if (n!= p) {
    printf("Matrices cannot be multiplied with each other.\n");
  } else {
    // умножаем матрицы
    for (c = 0; c < m; c++) {
      for (d = 0; d < q; d++) {
        for (k = 0; k < p; k++) {
          sum = sum + first[c][k] * second[k][d];
        }
        result[c][d] = sum;
        sum = 0;
      }
    }

    // выводим результирующую матрицу
    printf("The resulting matrix is:\n");
    for (c = 0; c < m; c++) {
      for (d = 0; d < q; d++) {
        printf("%d\t", result[c][d]);
      }
      printf("\n");
    }
  }

  return 0;
}

Программа попросит пользователя ввести элементы двух матриц, проверит, можно ли их умножить, умножит их, если это возможно, и выведет результирующую матрицу.

Полная программа

Вот полная программа, которая объединяет все этапы:

#include<stdio.h>

int main()
{
    int n, m, c, d, p, q, k, first[10][10], second[10][10], pro[10][10], sum = 0;

    printf("\nВведите количество строк и столбцов первой матрицы: \n\n");
    scanf("%d%d", &m, &n);

    printf("\nВведите %d элементов первой матрицы: \n\n", m*n);
    for(c = 0; c < m; c++) {
        for(d = 0; d < n; d++) {
            scanf("%d", &first[c][d]);
        }
    }

    printf("\nВведите количество строк и столбцов первой матрицы: \n\n");
    scanf("%d%d", &p, &q);

    if(n!= p)
        printf("Матрицы с заданным порядком не могут быть умножены друг на друга.\n\n");

    else {
        printf("\nВведите %d элементов второй матрицы: \n\n",m*n);

        for(c = 0; c < p; c++) {
            for(d = 0; d < q; d++) {
                scanf("%d", &second[c][d]);
            }
        }

        printf("\n\nПервая матрица: \n\n");
        for(c = 0; c < m; c++) {
            for(d = 0; d < n; d++) {
                printf("%d\t", first[c][d]);
            }
            printf("\n");
        }

        printf("\n\nВторая матрица: \n\n");
        for(c = 0; c < p; c++) {
            for(d = 0; d < q; d++){
                printf("%d\t", second[c][d]);
            }
            printf("\n");
        }

        for(c = 0; c < m; c++) {
            for(d = 0; d < q; d++) {
                for(k = 0; k < p; k++) {
                    sum = sum + first[c][k] * second[k][d];
                }
                pro[c][d] = sum;
                sum = 0;
            }
        }

        printf("\n\nПроизведение двух введенных матриц: \n\n");
        for(c = 0; c < m; c++) {
            for(d = 0; d < q; d++) {
                printf("%d\t", pro[c][d]);
            }
            printf("\n");
        }
    }
    printf("\n\n\t\t\tПрограммирование - это весело!\n\n\n");
    return 0;
}

Резюме

В этом практическом занятии мы научились создавать матрицу на языке C и выполнять различные виды операций умножения матриц. Мы создали программу для вычисления умножения двух матриц на языке C и обсудили стандартный алгоритм умножения матриц.