矩阵运算:C++ 代码实现矩阵加减乘

题目描述

本题是代码填空题,按要求补充给出代码的空白即可通过题目。

#include<bits/stdc++.h>
using namespace std;
const int N = 25;
int tt, p;
struct Matrix{
    int n, m;
    int a[N][N];
    Matrix operator+(Matrix &b){
        Matrix t;
        memset(t.a, 0, sizeof t.a);
        if(n != b.n || m != b.m){
            t.n = t.m = -1;
            return t;
        }
        t.n = n;
        t.m = m;
        for(int i = 1; i <= n; ++i)
            for(int j = 1; j <= m; ++j)
                t.a[i][j] = a[i][j] + b.a[i][j];
        return t;
    }
    Matrix operator-(Matrix &b){
        Matrix t;
        memset(t.a, 0, sizeof t.a);
        if(n != b.n || m != b.m){
            t.n = t.m = -1;
            return t;
        }
        t.n = n;
        t.m = m;
        for(int i = 1; i <= n; ++i)
            for(int j = 1; j <= m; ++j)
                t.a[i][j] = a[i][j] - b.a[i][j];
        return t;
    }
    Matrix operator*(Matrix &b){
        Matrix t;
        memset(t.a, 0, sizeof t.a);
        if(m != b.n){
            t.n = t.m = -1;
            return t;
        }
        t.n = n;
        t.m = b.m;
        for(int i = 1; i <= t.n; ++i)
            for(int j = 1; j <= t.m; ++j)
                for(int k = 1; k <= m; ++k)
                    t.a[i][j] += a[i][k] * b.a[k][j];
        return t;
    }
    void print(){
        if(n == -1 && m == -1){
            printf('error\n');
            return;
        }
        printf('%d %d\n', n, m);
        for(int i = 1; i <= n; ++i){
            for(int j = 1; j <= m; ++j)
                printf('%d ', a[i][j]);
            printf('\n');
        }
    }
} m[N], ans;
int main() {
	 scanf('%d%d', &tt, &p);
    for(int i = 1; i <= tt; ++i){
        scanf('%d%d', &m[i].n, &m[i].m);
        for(int r = 1; r <= m[i].n; ++r)
            for(int s = 1; s <= m[i].m; ++s)
                scanf('%d', &m[i].a[r][s]);
    }
    for(int i = 1; i <= p; ++i){
        int op, r, s;
        scanf('%d%d%d', &op, &r, &s);
        if(op == 1)
            ans = m[r] + m[s];
        else if(op == 2)
            ans = m[r] - m[s];
        else if(op == 3)
            ans = m[r] * m[s];
        ans.print();
    }
    
	 return 0;
}

有 $t$ 个矩阵(编号从 $1$ 开始),需要完成 $p$ 次矩阵运算。

  • 1 r s 表示第 $r$ 个矩阵和第 $s$ 个矩阵相加。
  • 2 r s 表示第 $r$ 个矩阵和第 $s$ 个矩阵相减。
  • 3 r s 表示第 $r$ 个矩阵和第 $s$ 个矩阵相乘。 用 $A_{ij}$ 来表示矩阵 $A$ 第 $i$ 行第 $j$ 列的元素。

矩阵加减法的运算法则为:首先必须保证参与运算的两个矩阵的行数都相同、列数也都相同,否则不能运算,加减法的结果矩阵 $C$ 的行列数和参与运算的 $A,B$ 是一样的,运算法则为对应位置相加减。

例如,$2\times 3$ 的矩阵 $A$ 可以和 $2\times 3$ 的矩阵 $B$ 相加减。运算法则公式可以写作 $C_{ij}=A_{ij}+B_{ij}$。

矩阵乘法的运算法则为:设 $A$ 为 $n\times m$ 的矩阵,$B$ 为 $p\times q$ 的矩阵,只有当 $m=p$ 时才能进行矩阵乘法,否则不能运算,乘法的结果矩阵 $C$ 是 $n\times q$ 的。

乘法运算公式可以写作 $C_{ij}=\sum_{k=1}^m A_{ik}B_{kj}$。

输入格式

从标准输入读入数据。 第一行输入两个正整数 $t,p$($t,p\le 20$)。 接下来 $t$ 个部分,每部分输入一个矩阵的信息。 每个矩阵的第一行先输入 $n,m$($n,m\le20$),表示该矩阵的行列数;接下来 $n$ 行,每行 $m$ 个整数(绝对值均 $\le 20$),构成这个矩阵。 矩阵输入完毕后,输入 $p$ 行运算命令,每行都是 $o, r, s$($r,s\le n$)的格式,含义见题面。

输出格式

输出到标准输出。 对于每个运算命令,像输入那样输出运算结果矩阵:先输出行数、列数,然后再输出这个矩阵的元素。 如果运算无效,则不输出矩阵,而是输出 error

样例 #1

样例输入 #1

3 4
2 3
1 2 3
4 5 6
2 3
-1 -2 -3
-4 -5 -6
3 1
7
8
9
1 1 2
2 1 2
3 1 2
3 1 3

样例输出 #1

0 0 0 
0 0 0 
2 4 6 
8 10 12 
error
50 
122

代码实现

#include<bits/stdc++.h>
using namespace std;
const int N = 25;
int tt, p;
struct Matrix{
    int n, m;
    int a[N][N];
    Matrix operator+(Matrix &b){
        Matrix t;
        memset(t.a, 0, sizeof t.a);
        if(n != b.n || m != b.m){
            t.n = t.m = -1;
            return t;
        }
        t.n = n;
        t.m = m;
        for(int i = 1; i <= n; ++i)
            for(int j = 1; j <= m; ++j)
                t.a[i][j] = a[i][j] + b.a[i][j];
        return t;
    }
    Matrix operator-(Matrix &b){
        Matrix t;
        memset(t.a, 0, sizeof t.a);
        if(n != b.n || m != b.m){
            t.n = t.m = -1;
            return t;
        }
        t.n = n;
        t.m = m;
        for(int i = 1; i <= n; ++i)
            for(int j = 1; j <= m; ++j)
                t.a[i][j] = a[i][j] - b.a[i][j];
        return t;
    }
    Matrix operator*(Matrix &b){
        Matrix t;
        memset(t.a, 0, sizeof t.a);
        if(m != b.n){
            t.n = t.m = -1;
            return t;
        }
        t.n = n;
        t.m = b.m;
        for(int i = 1; i <= t.n; ++i)
            for(int j = 1; j <= t.m; ++j)
                for(int k = 1; k <= m; ++k)
                    t.a[i][j] += a[i][k] * b.a[k][j];
        return t;
    }
    void print(){
        if(n == -1 && m == -1){
            printf('error\n');
            return;
        }
        printf('%d %d\n', n, m);
        for(int i = 1; i <= n; ++i){
            for(int j = 1; j <= m; ++j)
                printf('%d ', a[i][j]);
            printf('\n');
        }
    }
} m[N], ans;
int main() {
	 scanf('%d%d', &tt, &p);
    for(int i = 1; i <= tt; ++i){
        scanf('%d%d', &m[i].n, &m[i].m);
        for(int r = 1; r <= m[i].n; ++r)
            for(int s = 1; s <= m[i].m; ++s)
                scanf('%d', &m[i].a[r][s]);
    }
    for(int i = 1; i <= p; ++i){
        int op, r, s;
        scanf('%d%d%d', &op, &r, &s);
        if(op == 1)
            ans = m[r] + m[s];
        else if(op == 2)
            ans = m[r] - m[s];
        else if(op == 3)
            ans = m[r] * m[s];
        ans.print();
    }
    
	 return 0;
}

代码解释

  1. 结构体 Matrix 定义:

    • n, m:记录矩阵的行数和列数。
    • a[N][N]:二维数组,存储矩阵元素。
    • operator+, operator-, operator*:重载运算符,实现矩阵加减乘运算。
    • print:用于输出矩阵,如果运算无效则输出 'error'。
  2. 主函数 main:

    • 输入矩阵数量 tt 和操作数量 p
    • 输入每个矩阵的信息,包括行列数和元素值。
    • 处理每个操作:
      • 读取操作类型 op 和矩阵编号 rs
      • 根据操作类型进行矩阵加减乘运算。
      • 调用 print 函数输出结果矩阵。

总结

本文详细讲解了矩阵加减乘的运算原理,并提供了完整的 C++ 代码实现,帮助你理解矩阵运算的概念并学会用代码实现矩阵运算。希望这篇文章对你有所帮助!

矩阵运算:C++ 代码实现矩阵加减乘

原文地址: http://www.cveoy.top/t/topic/fPpm 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录