浅谈数学上的矩阵——矩阵的乘法运算的概念及C++上的实现模板

首先让我们来谈一谈数学意义上的矩阵(在座各位也可以简单地将它理解为一个二维数组)

这样可以帮助我们理解矩阵加速及其运用的原理(矩阵加速是一个及其玄学的东西,所以请重点理解矩阵乘法)

这里给出一段严格的数学定义来帮助理解矩阵的概念,简单地看一下就可以了:

在数学中,矩阵(Matrix)是一个按照长方阵列排列的实数或复数集合,最早来自于方程组的系数及常数所构成的方阵。

矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中,矩阵的运算是数值分析领域的重要问题。在物理学中,矩阵在电路学、力学、光学和量子物理中都有应用。在计算机学科中,三维动画制作也需要用到矩阵。

由m×n个数aij排成的m行n列的数表称为m行n列的矩阵,简称m×n矩阵。记作:

这m×n个数称为矩阵A的元素,简称元。数aij位于矩阵A的第i行第j列,称为矩阵A的(i,j)元,以数aij为(i,j)元的矩阵可记为(aij)或(aij)m×n,m×n矩阵A也记作Amn。

元素是实数的矩阵称为实矩阵,元素是复数的矩阵称为复矩阵。而行数与列数都等于n的矩阵称为n阶矩阵或n阶方阵。n阶方阵中所有i=j的元素aij组成的斜线称为(主)对角线,所有i+j=n+1的元素aij组成的斜线称为辅对角线。

现在我们进入今天的正题:矩阵意义上的乘法(矩阵与矩阵相乘)

直接给出公式:

化简一下便于我们理解:

再给出一个例子:

(好好看一下,这样理解很重要)

建议读者在自己写几个矩阵相乘的方法,熟悉一下基本的模式。

模板:

//这里采用了结构体封装的方式,更加简便
struct Matrix {
    LL n,m,c[N][N];
    Matrix() { memset(c,0,sizeof(c)); };
    void _read() {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%lld",&c[i][j]);
    }
    Matrix operator * (const Matrix& a) {
        Matrix r;
        r.n=n;r.m=a.m;
        for(int i=1;i<=r.n;i++)
            for(int j=1;j<=r.m;j++)
                for(int k=1;k<=m;k++)
                    r.c[i][j]= (r.c[i][j]+ (c[i][k] * a.c[k][j])%mod)%mod;
        return r;
    }
    void _print() {
        for(int i=1;i<=n;i++) {
            for(int j=1;j<=m;j++) {
                if(j!=1) cout<<" ";
                cout<<c[i][j];
            }
            if(i!=n) puts("");
        }
    }
}
原文地址:https://www.cnblogs.com/MisakaMKT/p/11252293.html