PTA_L1-048 矩阵A乘以B (15分)
发布日期:2021-05-14 16:34:33 浏览次数:21 分类:精选文章

本文共 1706 字,大约阅读时间需要 5 分钟。

矩阵乘法是一个常见的线性代数操作,结果阵的元素由原两矩阵的元素按指定规则相乘并求和得到。要执行矩阵相乘,首先必须验证两个矩阵的列数和行数是否匹配,即左边矩阵的列数是否等于右边矩阵的行数。

输入格式

给定两个矩阵A和B,格式如下:

  • 每行先给出矩阵的行数和列数。
  • 然后依次给出R行的数值,每行包括C个整数,用空格分隔。

输出格式

如果两矩阵的尺寸匹配,返回它们的乘积矩阵AB;否则返回错误信息:“错误:Ca != Rb”,其中Ca是A的列数,Rb是B的行数。

解题思路

  • 输入矩阵:首先读取第一个矩阵A的行数和列数,随后读取其Elements。接着读取第二个矩阵B的行数和列数及其Elements。
  • 验证尺寸:检查矩阵A的列数是否与矩阵B的行数相等。尺寸不匹配时,直接返回错误信息。
  • 执行矩阵乘法:初始化结果矩阵,逐个计算每个元素,该元素等于矩阵A的一行与矩阵B的一列元素的点积。
  • 输出结果:按照指定的格式输出结果矩阵。
  • 实现代码

    #include 
    #include
    using namespace std;
    int main() {
    vector
    > a, b, product;
    int Ra, Ca, Rb, Cb;
    // Read matrix a
    cin >> Ra >> Ca;
    for (int i = 0; i < Ra; ++i) {
    a.push_back(vector
    (Ca));
    for (int j = 0; j < Ca; ++j) {
    cin >> a[i][j];
    }
    }
    // Read matrix b
    cin >> Rb >> Cb;
    for (int i = 0; i < Rb; ++i) {
    b.push_back(vector
    (Cb));
    for (int j = 0; j < Cb; ++j) {
    cin >> b[i][j];
    }
    }
    // Check if multiplication is possible
    if (Ca != Rb) {
    printf("Error: %d != %d\n", Ca, Rb);
    return;
    }
    // Compute the product matrix
    product.resize(Ra, vector
    (Cb)); for (int i = 0; i < Ra; ++i) { for (int j = 0; j < Cb; ++j) { int sum = 0; for (int k = 0; k < Ca; ++k) { sum += a[i][k] * b[k][j]; } product[i][j] = sum; } } // Output the product matrix cout << Ra << ' ' << Cb << endl; for (int i = 0; i < Ra; ++i) { cout << product[i][0]; for (int j = 1; j < Cb; ++j) { cout << ' ' << product[i][j]; } cout << endl; } return 0; }

    代码解释

    • 读取输入:首先读取矩阵的尺寸,并将每个矩阵存储为二维向量。
    • 尺寸检查:检查两矩阵是否可乘,尺寸不匹配时输出错误信息并退出。
    • 进行矩阵乘法:逐个计算每个结果元素,利用三重循环实现点积计算。
    • 输出结果:按照格式输出结果矩阵,确保每一行正确显示结果元素。
    上一篇:PTA_L1-049 天梯赛座位分配 (20分)
    下一篇:PTA_L1-050 倒数第N个字符串 (15分)

    发表评论

    最新留言

    关注你微信了!
    [***.104.42.241]2025年04月20日 03时49分45秒