首页 > 其他分享 >矩阵 学习笔记

矩阵 学习笔记

时间:2024-05-30 15:33:18浏览次数:9  
标签:end mat 矩阵 笔记 学习 ans array Matrix

引入

矩阵的引入来自线性方程组,将其左边每一项的系数右边的常数抽象出来就是矩阵。

\[\left\{ \begin{array}{} x_1 + 2x_2 = 4 \\ 2x_1 + 3x_2 = 5 \end{array} \right. \Leftrightarrow \left[ \begin{array}{} 1 & 2 \\ 2 & 3 \end{array} \right] \left[ \begin{array}{} x_1\\ x_2 \end{array} \right] = \left[ \begin{array}{} 4 \\ 5 \end{array} \right] \]

一般用 \([]\) 或 \(()\) 表示矩阵。

定义

主对角线

对于一个矩阵 \(A\),\(A_{i,i}\) 为该矩阵主对角线。

单位矩阵

一般用 \(I\) 表示,它的主对角线是 \(1\),其余的是 \(0\)。

全零矩阵

对于一个矩阵,如果其所有元素均为 \(0\),则称其为全零矩阵,记作 \(0\)。

同型矩阵

两个矩阵,行数与列数对应相同,称为同型矩阵。

转置矩阵

如果矩阵 \(A\) 和矩阵 \(B\) 满足:

  1. 矩阵 \(A\) 的行数等于矩阵 \(B\) 的列数,矩阵 \(A\) 的列数等于矩阵 \(B\) 的行数。
  2. 对于 \(\forall i,j, A_{i,j} = B_{j,i}\)。
    则称 \(A\) 是 \(B\) 的转置矩阵,记作 \(A = B^T\)。

方阵

一个行数和列数相等的矩阵。

一个大小为 \(n\) 的矩阵叫作 \(n\) 阶矩阵或 \(n\) 阶方阵。

三角矩阵

如果方阵主对角线左下方的元素均为 \(0\),称为上三角矩阵。如果方阵主对角线右上方的元素均为 \(0\),称为下三角矩阵。

两个上(下)三角矩阵的乘积仍然是上(下)三角矩阵。如果对角线元素均非 \(0\),则上(下)三角矩阵可逆,逆也是上(下)三角矩阵。

单位三角矩阵

如果上三角矩阵 \(A\) 的对角线全为 \(1\),则称 \(A\) 是单位上三角矩阵。如果下三角矩阵 \(A\) 的对角线全为 \(1\),则称 \(A\) 是单位下三角矩阵。

两个单位上(下)三角矩阵的乘积仍然是单位上(下)三角矩阵,单位上(下)三角矩阵的逆也是单位上(下)三角矩阵。

运算

线性运算

对两个同型矩阵可以作加(减)法,得到的答案是对应元素的和(差)。

矩阵的转置

即将一个矩阵变成它的转置矩阵

矩阵乘法

如果矩阵 \(A\) 的行数等于矩阵 \(B\) 的列数,列数等于矩阵 \(B\) 行数,则这两个矩阵可以相乘,相乘的积矩阵 \(C\),满足 \(C_{i,j} = \sum A_{i,k} \times B_{k,j}\),即矩阵 \(C\) 的第 \(i\) 行第 \(j\) 列等于矩阵 \(A\) 的第 \(i\) 行乘上矩阵 \(B\) 的第 \(j\) 列。

可以发现,矩阵 \(C\) 的行数等于矩阵 \(A\) 的行数,列数等于矩阵 \(B\) 的列数。

因此矩阵乘法不满足交换律

矩阵乘法运算律

  1. 乘法结合律,\(A \times (B \times C) = (A \times B) \times C\)。
  2. 乘法分配律,\(A \times (B + C) = A \times B + A \times C\)。

矩阵的逆

如果 \(A \times B = I\),那么 \(B\) 是 \(A\) 的逆矩阵,记作 \(A^{-1}\)。

注意:逆矩阵不一定存在,但如果逆矩阵存在则是唯一的,至于怎么求,可以用高斯消元

行列式

行列式

实现

可以发现矩阵可以使用二维数组进行模拟。

显然地,线性运算时间复杂度 \(\mathcal{O}(n ^ 2)\),乘法运算时间复杂度 \(\mathcal{O}(n^3)\)。

对于普通的矩阵这两个复杂度是不能优化的。

常数优化

当然进行矩阵乘法时,可以通过改变循环顺序加速高速缓存的访问优化部分常数(还挺猛),对于小矩阵也可以通过循环展开实现。

struct Matrix{
	int mat[N][N];

	Matrix(){
		memset(mat, 0, sizeof(mat));
	}
	
	int * operator [] (const int & x){
		return mat[x];
	}
	
	Matrix operator * (const Matrix & x){
		Matrix ans;
		
        for (int k = 1; k <= m; k++) {
            for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= x.m; j++) {
                        //multi
                }
            }
        }

        return ans;

    }
};

矩阵乘法的运用

矩阵快速幂

过程

因为矩阵有结合律,所以自然可以使用快速幂进行优化矩乘。

实现

Matrix qpow(int b, Matrix & mat){//mat 是转移矩阵
    Matrix ans;

	//prework
  
    for (; b; b >>= 1, mat = mat * mat) {
        if (b & 1) {
	        ans = ans * mat;// matrix multi
		}
	}
	
    return ans;
}

矩阵加速递推

一个经典的矩阵快速幂问题,斐波拉契数列

在斐波拉契数列中,

\[F_i = \begin{cases} 1 & i = 1 \vee i = 2 \\ F_{i - 1} + F_{i - 2} & \text{otherwise} \end{cases} \]

很显然的可以构造矩阵,

\[\left[ \begin {array} {} F_{i} & F_{i - 1} \end {array} \right] \left[ \begin {array} {} 1 & 0 \\ 1 & 1 \end {array} \right] = \left[ \begin {array} {} F_{i + 1} & F_{i} \end {array} \right] \]

实现

此处求斐波拉契第 \(n\) 项模 \(10 ^ 9 + 7\) 的结果的部分代码。

i64 n;

Matrix qpow(i64 b){
    Matrix mat, ans;
    
    ans[1][1] = 1, ans[1][2] = 0;
    ans[2][1] = 0, ans[2][2] = 1;
    
    mat[1][1] = 1, mat[1][2] = 1;
    mat[2][1] = 1, mat[2][2] = 0;
    
    for (; b; b >>= 1, mat = mat * mat) {
        if (b & 1) {
            ans = ans * mat;
        }    
    }
    
    return ans;
}
int main(){
    scanf("%lld", &n);
    Matrix ans = qpow(n - 1);
    printf("%lld", ans[1][1]);
    return 0;
}

线性常系数齐次递推式

当然,有时会在递推式中给定一些常数。

比如:

\(F_i = F_{i - 1} + F_{i - 2} + i ^ 2 + i\)。

\(i\) 的递推可以由 \(i - 1 + 1\) 得到,\(i ^ 2\) 可以由 \((i - 1) ^ 2 + i ^ 2 - (i - 1) ^ 2 = 2i - 1 + (i - 1)^2\) 得到。

所以维护 \(i^0,i^1, i^2\) 即可,就可以构造如下矩阵实现状态转移。

\[\left [ \begin{array} {} F_i & F_{i - 1} & i^2 & i & 1 \end{array} \right] \left [ \begin{array} {} 1 & 1 & 0 & 0 & 0 \\ 1 & 0 & 0 & 0 & 0 \\ 1 & 0 & 1 & 0 & 0 \\ 1 & 0 & 2 & 1 & 0 \\ 0 & 0 &-1 & 1 & 1 \end{array} \right] = \left [ \begin{array} {} F_{i + 1} & F_{i} & {i + 1}^2 & i + 1 & 1 \end{array} \right] \]

矩阵表修改

THUSCH2017 大魔法师

标签:end,mat,矩阵,笔记,学习,ans,array,Matrix
From: https://www.cnblogs.com/zdrj/p/18222351

相关文章

  • uni-app学习完结
    昨天空余一天,并未写记录,是昨天属于项目完结,这里把最后的打包上线等这里说下。打包成微信小程序打包成微信小程序,这需要再微信公众平台里面,进行登陆和设置。这里说下,注册的后,选择需要开发的功能,然后进入后根据提示,会有需要设定小程序的名称、类型等,然后认证这些,但是认证需......
  • GraphEdit论文阅读笔记
    GraphEdit:LargeLanguageModelsforGraphStructureLearning论文阅读笔记读一下图结构学习的论文,找找灵感Abstract​ 图结构学习(GSL)侧重于通过生成新的图结构来捕获图结构数据中节点之间的内在依赖性和交互作用。许多现有的GSL方法严重依赖于显式的图结构信息作为监督信......
  • AXI4+DDR学习
    我用的小梅哥的7010的开发板,这个板子无法直接在PL这边使用DDR存储,必须通过AXI4总线。HighPerformamcePORTS就是HP接口,为AXI接口,通常用于大量数据的高速传输。AXI总线介绍  AXI是基于burst的传输,burst传输是一种适用于AMBA协议的规则形式,通过这种规则,我们可以控制AMBA进行......
  • 锁相环学习---CD4046
    介绍​ cd4046主要用于调频(FM)信号的调制与解调,频率的合成,各种音频产生的领域。本博文主要介绍一下CD4046的一些基础配置还有基础用法,用2023年电赛H题为例子搭建(其实我也只会这个了QAQ),第一次学这个东西,如果有讲不到的东西,请见谅......
  • AnyCAD中的Editor示例代码学习1
    AnyCADRapidSDK(ARS)是一个包含三维几何造型、图形显示、数据管理等模块综合三维图形平台,支持Windows、Linux、MacOS多操作系统,支持.NET、Python、Java多开发语言,可以用于开发CAD/CAE/CAM/SIM应用程序,用于机械、建筑、电力、教育、机器人、科学计算等领域。目前计划基于Anyc......
  • Java学习笔记(三)
    Java学习笔记(三)对象和类对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。类:类是一个模板,它描述一类对象的行为和状态。下图中汽车为类(class),而具体的每辆车为该汽车类的对象(object),对象包含了......
  • Git使用笔记
    全局Git配置查看用户名和邮箱gitconfiguser.namegitconfiguser.email修改用户名和邮箱gitconfig--globaluser.name"username"gitconfig--globaluser.email"email"生成SSH公钥ssh-keygen-trsa-C"邮箱"重置git本地密码gitconfig--system--......
  • 数据结构学习笔记-冒泡排序
    冒泡排序的算法设计与分析问题描述:设计并分析冒泡排序算法【算法设计思想】遍历数组,从第一个元素到倒数第二个元素(因为最后一个元素不需要再比较,它已经是最大的了)。在每次遍历过程中,再次遍历未排序部分的元素(从第一个到当前未排序部分的末尾),比较相邻的两个元素,如果顺序不正确......
  • 算法课程笔记——快速幂
    算法课程笔记——快速幂......
  • 深度学习之AlexNet、VGG-19、VGG-16、LeNet-5、ResNet模型的训练
    一.AlexNet1.1.导入资源包importcv2importmatplotlib.pyplotaspltimportnumpyasnpimportosimportrandom注:cv2:这是OpenCV模块,用于处理图像和视频,包括摄像头捕捉、图像处理、特征检测等。matplotlib.pyplotasplt:这是Matplotlib模块的一部分,用于创建和......