矩阵运算:加减乘法实现与代码填空

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

#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-(/*补全函数*/){
        /*补全函数*/
    }
    /*
        补全其余未定义的函数
    */
} m[N], ans;
Matrix operator*(/*补全函数*/){
    /*补全函数*/
}
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 个矩阵相乘。 用 Aij 来表示矩阵 Ai 行第 j 列的元素。

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

例如,2×3 的矩阵 A 可以和 2×3 的矩阵 B 相加减。运算法则公式可以写作 Cij=Aij+Bij

矩阵乘法的运算法则为:设 An×m 的矩阵,Bp×q 的矩阵,只有当 m=p 时才能进行矩阵乘法,否则不能运算,乘法的结果矩阵 Cn×q 的。

乘法运算公式可以写作 Cij=∑k=1m AikBkj

输入格式

从标准输入读入数据。 第一行输入两个正整数 t,pt,p≤20)。 接下来 t 个部分,每部分输入一个矩阵的信息。 每个矩阵的第一行先输入 n,mn,m≤20),表示该矩阵的行列数;接下来 n 行,每行 m 个整数(绝对值均 ≤ 20),构成这个矩阵。 矩阵输入完毕后,输入 p 行运算命令,每行都是 o, r, sr,s≤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

写出一个正确的C++代码内容:```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 <= n; ++i) for(int j = 1; j <= b.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;

}

矩阵运算:加减乘法实现与代码填空

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

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