📜  门| GATE-CS-2016(套装2)|问题 26(1)

📅  最后修改于: 2023-12-03 15:28:45.086000             🧑  作者: Mango

题目概述

本题目来自于GATE-CS-2016(套装2)中的问题 26。本题目要求编写一个C++程序来实现一个矩阵相乘的功能,并输出结果矩阵。

程序设计思路

本程序的主要功能就是实现两个矩阵的乘法。矩阵乘法的规则是:一个 MN 的矩阵 A 与一个 NP 的矩阵 B 相乘得到一个 M*P 的矩阵 C。矩阵 C 中的第 i 行第 j 列的元素可用以下公式计算:

matrix-multiply-formula

因此,本程序的主要思路就是读入两个矩阵 A 和 B,按照上述规则相乘,最后输出结果矩阵 C。

具体实现包括以下步骤:

  1. 读入两个矩阵 A 和 B,同时验证输入的矩阵大小是否符合矩阵相乘要求。
  2. 分配 C 矩阵所需的内存空间。
  3. 按照上述公式,计算矩阵 C 中每个元素的值。
  4. 输出结果矩阵 C。
代码实现

下面是本程序的 C++ 代码实现,代码中包括对输入的错误检测和对程序执行过程中动态内存的分配和释放:

#include <iostream>

using namespace std;

int main() {

    int m1, n1, m2, n2;    // 两个矩阵的大小

    // 读入矩阵 A
    cin >> m1 >> n1;
    int **A = new int*[m1];
    for (int i = 0; i < m1; i++) {
        A[i] = new int[n1];
        for (int j = 0; j < n1; j++) {
            cin >> A[i][j];
        }
    }

    // 读入矩阵 B
    cin >> m2 >> n2;
    int **B = new int*[m2];
    for (int i = 0; i < m2; i++) {
        B[i] = new int[n2];
        for (int j = 0; j < n2; j++) {
            cin >> B[i][j];
        }
    }

    // 验证输入的矩阵大小是否符合矩阵相乘要求
    if (n1 != m2) {
        cout << "Error: the matrices are not compatible for multiplication!" << endl;
        // 动态分配的内存需要手动释放
        for (int i = 0; i < m1; i++) {
            delete [] A[i];
        }
        delete [] A;
        for (int i = 0; i < m2; i++) {
            delete [] B[i];
        }
        delete [] B;
        return 1;
    }

    // 分配 C 矩阵所需的内存空间
    int **C = new int *[m1];
    for (int i = 0; i < m1; i++) {
        C[i] = new int [n2];
        for (int j = 0; j < n2; j++) {
            C[i][j] = 0;
        }
    }

    // 计算矩阵 C 中每个元素的值
    for (int i = 0; i < m1; i++) {
        for (int j = 0; j < n2; j++) {
            for (int k = 0; k < n1; k++) {
                C[i][j] += A[i][k] * B[k][j];
            }
        }
    }

    // 输出矩阵 C
    for (int i = 0; i < m1; i++) {
        for (int j = 0; j < n2; j++) {
            cout << C[i][j] << " ";
        }
        cout << endl;
    }

    // 释放动态分配的内存
    for (int i = 0; i < m1; i++) {
        delete [] A[i];
    }
    delete [] A;
    for (int i = 0; i < m2; i++) {
        delete [] B[i];
    }
    delete [] B;
    for (int i = 0; i < m1; i++) {
        delete [] C[i];
    }
    delete [] C;

    return 0;
}
总结

本程序通过实现矩阵相乘算法,完成了两个矩阵的相乘,并输出结果矩阵。在实现过程中,需要注意输入错误的检测和动态内存的分配和释放。矩阵相乘是计算机科学中一个非常基本的问题,通过掌握本程序中的算法实现,可以更好地理解和运用相关算法和数据结构。