矩阵乘法与加法模板 Matrix

更新日志 20250119:开工。

运算法则

对于矩阵乘法运算

\[A\times B=C \]

你可以认为,\(C\) 中第 \(i\) 行第 \(j\) 列的元素,就是 \(A\) 的第 \(i\) 行依次与 \(B\) 的第 \(j\) 列相乘的乘积之和。

形式化的:

\[C_{i,j}=\sum_{k=1}^n A_{i,k}B_{k,j} \]

写成代码就是:

rep(i,1,n)rep(j,1,n)rep(k,1,n)
    c[i][j]+=a[i][k]*b[k][j];

至于加法,各位分别相加即可。

封装模板

template <typename T>
struct matrix{
    int n;
    vec<vec<T>> x;
    matrix(int l,bool k=0){
        n=l;
        x.resize(n,vec<T>(n,0));
        if(k)repl(i,0,n)x[i][i]=1;
    }
    vec<T>& operator[](int i){return x[i];}
    matrix operator+(matrix obj){
        matrix c(n);
        repl(i,0,n)repl(j,0,n)
            c[i][j]=x[i][j]+obj[i][j];
        return c;
    }
    matrix operator*(matrix obj){
        matrix c(n);
        repl(i,0,n)repl(j,0,n)repl(k,0,n)
            c[i][j]+=x[i][k]*obj[k][j];
        return c;
    }
    bool operator==(matrix obj){
        if(n!=obj.n)return 0;
        repl(i,0,n)repl(j,0,n)
            if(x[i][j]!=obj[i][j])return 0;
        return 1;
    }
};

模板特点

  • 首先你可以自由传入类型。当然肯定是 \(\text{int,long long}\) 之类的数。
  • 使用了动态数组(实际上是vector)可以动态开空间。
  • 可以初始化矩阵 \(1\)。第二个参数传入 \(1\) 即可。(第一个参数是大小)
  • 重载了+ * ==等运算符。没啥好说的。
  • 重载了下标,也就是可以直接通过这个矩阵的名字作为数组名(Matrix[][]),而不用 Matrix.x[][]
  • 以及留作提醒,初始化矩阵,无需一个一个下标去赋值,可以直接 Matrix.x={},也就是直接给 vector 赋值即可。这样直接写会方便一些。
  • 以及常数可能略大。

差不多就这样。

posted @   LastKismet  阅读(13)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示