首页 > 其他分享 >矩阵入门

矩阵入门

时间:2023-05-22 17:46:48浏览次数:76  
标签:begin end 入门 矩阵 base bmatrix 向量

矩阵

向量与矩阵

在线性代数中,向量分为列向量和行向量。

向量也是特殊的矩阵,行向量可以看作是一个 \(1\times n\) 的矩阵,例如下面这样:

\[\begin{bmatrix} 1&2&3&4&5 \end{bmatrix} \]

列向量可以看作是一个 \(n\times 1\) 的矩阵,例如下面这样:

\[\begin{bmatrix} 1\\2\\3\\4\\5 \end{bmatrix} \]

也可以写成由行向量转置而来的,比如上面的列向量可以这样写:

\[\begin{bmatrix} 1&2&3&4&5 \end{bmatrix}^{T} \]

线性代数的主要研究对象是列向量,约定使用粗体小写字母表示列向量。在用到大量向量与矩阵的线性在数中,不引起混淆的情况下,在手写时,字母上方的向量记号可以省略不写。

如果想要表示行向量,需要在粗体小写字母右上方写转置符号。行向量在线性代数中一般表示方程。

引入

矩阵的引入来自于线性方程组,与向量类似,都是为了能以更少的字符来表示更多的信息,就比如下面的线性方程组:

\[\left\{\begin{matrix} 7x_{1}+8x_{2}+9x_{3}=13 \\ 4x_{1}+5x_{2}+6x_{3}=12 \\ 1x_{1}+2x_{2}+3x_{3}=11 \end{matrix}\right. \]

一般使用圆括号或方括号来表示矩阵。上面的方程组写成矩阵的形式就是:

\[\begin{bmatrix} 7& 8& 9\\ 4& 5& 6\\ 1& 2& 3 \end{bmatrix} \begin{bmatrix} x_{1}\\ x_{2}\\ x_{3} \end{bmatrix} = \begin{bmatrix} 13\\ 12\\ 11 \end{bmatrix} \]

我觉得方括号更整齐好看于是就用的方括号

简记为:

\[Ax=b \]

表示位置数列向量 \(x\) 左乘一个矩阵 \(A\),得到列向量 \(b\)。这个式子可以认为是线性代数的基本形式。

线性代数主要研究的运算模型是内积,内积是先相乘再相加,是行向量左乘列向量,得到一个数的过程。矩阵乘法是内积的拓展,矩阵乘法等价于左边矩阵拿出来一行与右边矩阵抽出一列来进行内积,得到结果矩阵的对应元素,口诀「左行右列」。

定义

对于矩阵 \(A\),主对角线是指 \(A_{i,i}\) 的元素。

一般用 \(I\) 来表示单位矩阵,就是主对角线上为 \(1\),其余位置为 \(0\) 的矩阵。

同型矩阵

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

方阵

行数等于列数的矩阵称为方阵。方阵是一种特殊的矩阵。对于「\(n\) 阶矩阵」的习惯表述,实际上讲的就是 \(n\) 阶方阵。阶数相同的方阵为同型矩阵。

主对角线

方阵中行数等于列数的元素构成主对角线

对称矩阵

如果将方阵的元素关于主对角线对称,即对于任意的 \(i\) 和 \(j\),都有 \(a_{ij}=a_{ji}\),则称该方阵为对称矩阵,其中 \(a_{ij}\) 表示矩阵 \(A\) 中第 \(i\) 行第 \(j\) 列的元素

对角矩阵

主对角线之外的元素均为 \(0\) 的方阵称为对角矩阵,一般记作:

\[\text{diag}\left\{\lambda_{1},\ldots,\lambda_{}n\right\} \]

式子中的 \(\lambda_{1},\ldots,\lambda_{n}\) 是主对角线上的元素。

对角矩阵是对称矩阵。

如果对角矩阵的元素均为 \(1\),则称为单位矩阵,记为 \(I\)。只要乘法可以进行,任何矩阵乘单位矩阵仍保持不变。

三角矩阵

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

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

单位三角矩阵

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

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

运算

矩阵的线性运算分为加减法与数乘,他们均为逐个元素进行。只有同型矩阵之间可以对应相加减。

矩阵的转置

矩阵的转置,就是在矩阵的右上角写上转置「T」记号,表示将矩阵的行与列互换。

对称矩阵转置前后保持不变。

矩阵乘法

矩阵的乘法是向量内积的推广。

矩阵相乘只有在第一个矩阵的列数和第二个矩阵的行数相同时才有意义。

设 \(A\) 为 \(P\times M\) 的矩阵,\(B\) 为 \(M\times Q\) 的矩阵,设 \(C\) 矩阵为矩阵 \(A\) 与 \(B\) 的乘积。

其中矩阵 \(C\) 中的第 \(i\) 行第 \(j\) 列的元素可以表示为:

\[C_{ij}=\sum_{k=1}^{M}A_{ik}B_{kj} \]

找了张好理解的图片:

image

原文:B2105 矩阵乘法 题解 - Daidly's Blog - 洛谷博客

在矩阵乘法中,结果 \(C\) 矩阵的第 \(i\) 行第 \(j\) 列的数,就是由矩阵 \(A\) 第 \(i\) 行 \(M\) 个数与矩阵 \(B\) 第 \(j\) 列 \(M\) 个数分别相乘再相加得到的。这里的相乘再相加,就是向量的内积。乘积矩阵中第 \(i\) 行第 \(j\) 列的数恰好是乘数矩阵 \(A\) 第 \(i\) 个行向量与乘数矩阵 \(B\) 第 \(j\) 个列向量的内积。

注意矩阵乘法满足结合律但不满足一般的交换律

利用结合律,矩阵乘法可以利用快速幂的思想来优化

小优化

对于较小的矩阵,可以直接手动展开循环来减小常数。

可以重新排列循环以提高空间局部性,这样的优化不会改变时间复杂度,但是可以得到常数上的提升。

矩阵快速幂

快速幂都会,那矩阵快速幂呢?

在后面的矩阵加速递推等都需要用到他,原理是什么?

大致的写法分为两种:重载运算符和函数,我个人比较喜欢函数的写法。

我们可以按正常的快速幂写法来,区别就是在其中的底数换成了矩阵,然后写一个矩阵乘法的函数来进行相乘即可。

P3390【模板】矩阵快速幂 - 洛谷

参考代码:

#include<bits/stdc++.h>
#define int long long
#define P 1000000007
#define endl '\n'
#define N 110 
using namespace std;
struct sb{int m[N][N];}ans;
int n,k;
inline int read(){int x=0,f=1;char ch=getchar();while(!isdigit(ch)){f=ch!='-';ch=getchar();}while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return f?x:-x;}
inline sb cheng(sb a,sb b)
{
    sb c;
    for(int i=1;i<=n;i++)
    {
          for(int j=1;j<=n;j++)
          {
              c.m[i][j]=0;
            for(int k=1;k<=n;k++)
              c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%P;
          }
    }
    return c;
}
inline sb jzksm(sb x,int y)
{
    sb res=x;y--;
    while(y)
    {
        if(y&1)res=cheng(res,x);
        x=cheng(x,x);
        y>>=1;
    }
    return res;
}
signed main()
{
    n=read();k=read();
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
        ans.m[i][j]=read();
    ans=jzksm(ans,k);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
          cout<<ans.m[i][j]<<" ";
        cout<<endl;
    }
    return 0;
}

方阵的逆

方阵 \(A\) 的逆矩阵 \(P\) 是使得 \(A\times P=I\) 的矩阵。

逆矩阵不一定存在,如果存在可以用高斯消元来求解。

方阵的行列式

行列式是方阵的一种运算。

看待线性方程组的两种视角

看待一个矩阵 \(A\),有两种视角。

第一种观点:按行看,观察 \(A\) 的每一行,这样一来把 \(A\) 看作方程组。于是就有了消元法解方程的过程。

第二种观点:按列看,观察 \(A\) 的每一列,\(A\) 本身也是由列向量构成的。此时相当于把变换 \(A\) 本身看成了列向量组,而 \(x\) 是未知数系数,思考 \(A\) 当中的这组列向量能不能配上未知数,凑出列向量 \(b\) 。

例如:文章开头的例子变为:

\[\begin{bmatrix} 7\\4\\1 \end{bmatrix}x_{1}+\begin{bmatrix} 8\\5\\2 \end{bmatrix}x_{2}+\begin{bmatrix} 9\\6\\3 \end{bmatrix}x_{3}= \begin{bmatrix} 13\\12\\11 \end{bmatrix} \]

解方程变为研究是否可以通过调整三个系数 \(x\) 使得给定的三个基向量能够凑出结果的向量。

按列看比按行看更新颖。在按列看的视角下,可以研究线性无关与线性相关。

矩阵乘法的应用

矩阵加速递推

斐波那契数列大家应该非常熟悉,在学习递归或者递推的时候应该是有做过相关题目的,在斐波那契数列里面,\(F_{1}=F_{2}=1,F_{i}=F_{i-1}+F_{i-2}(i\ge3)\)。

我们在之前的题目遇见的求斐波那契数列第 \(n\) 项的值范围都是很小的,因为递归的速度太慢,如果数据范围到达了 \(10^{18}\) 那么我们递推也是一定 TLE 的,所以这个时候就需要用到我们的矩阵加速递推。

设 \(Fib(n)\) 表示一个 \(1\times 2\) 的矩阵 \(\begin{bmatrix}F_{n}&F_{n+1}\end{bmatrix}\) 。我们希望依据 \(Fib(n-1)=\begin{bmatrix}F_{n-1}&F_{n-2}\end{bmatrix}\) 推出 \(Fib(n)\)。

试着来推导一个矩阵 \(\text{base}\),使 \(Fib(n-1)\times \text{base}=Fib(n)\),也就是 \(\begin{bmatrix}F_{n-1}&F_{n-2}\end{bmatrix}\times \text{base}=\begin{bmatrix}F_{n}&F_{n-1}\end{bmatrix}\)。

因为 \(F_{n}=F_{n-1}+F_{n-2}\),所以 \(\text{base}\) 矩阵第一列一定是 \(\begin{bmatrix}1\\1\end{bmatrix}\),这样才能在进行乘法运算的时候才能令 \(F_{n-1}\) 与 \(F_{n-2}\) 相加,从而得出 \(F_{n}\)。同理,为了得出 \(F_{n-1}\),矩阵 \(\text{base}\) 的第二列应该为 \(\begin{bmatrix}1\\0\end{bmatrix}\)。

综上所述,\(\text{base}=\begin{bmatrix}1&1\\1&0\end{bmatrix}\) ,原式化为 \(\begin{bmatrix}F_{n-1}&F_{n-2}\end{bmatrix}\times \begin{bmatrix}1&1\\1&0\end{bmatrix}=\begin{bmatrix}F_{n}&F_{n-1}\end{bmatrix}\)。

定义初始矩阵 \(ans=\begin{bmatrix}F_{2}&F_{1}\end{bmatrix}=\begin{bmatrix}1&1\end{bmatrix}\),\(\text{base}=\begin{bmatrix}1&1\\1&0\end{bmatrix}\)。那么,\(F_{n}\) 就等于 \(ans\times \text{base}^{n-2}\) 这个矩阵的第一行第一列的元素,也就是 \(\begin{bmatrix}1&1\end{bmatrix}\times \begin{bmatrix}1&1\\1&0\end{bmatrix}^{n-2}\) 的第一行第一列的元素。

注意矩阵乘法不满足交换律,所以不能将两个矩阵反过来,另外,对于 \(n\le 2\) 的情况,可以直接输出 \(1\)。

P1962斐波那契数列 - 洛谷

参考代码:

#include<bits/stdc++.h>
#define int long long
#define P 1000000007
#define N 110
using namespace std;
int n;
struct sb{int m[N][N];}ans,base;
inline sb cheng(sb a,sb b,int ok)
{
    sb c;
    for(int i=1;i<=ok;i++)
    {
          for(int j=1;j<=ok;j++)
          {
              c.m[i][j]=0;
            for(int k=1;k<=ok;k++)
              c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%P;
          }
    }
    return c;
}
inline sb jzksm(sb x,int y)
{
    sb res=x;y--;
    while(y)
    {
        if(y&1)res=cheng(res,x,2);
        x=cheng(x,x,2);
        y>>=1;
    }
    return res;
}
signed main()
{
    cin>>n;
    if(n==1||n==2){puts("1");return 0;}
    ans.m[1][1]=1;ans.m[1][2]=1;
    base.m[1][1]=1;base.m[1][2]=1;
    base.m[2][1]=1;base.m[2][2]=0;
    base=jzksm(base,n-2);
    ans.m[1][1]=(base.m[1][1]+base.m[1][2])%P;
    cout<<ans.m[1][1]<<endl;
    return 0;
}

大部分内容来自 OI Wiki。

标签:begin,end,入门,矩阵,base,bmatrix,向量
From: https://www.cnblogs.com/Multitree/p/17421265.html

相关文章

  • 邻接矩阵的算法设计
    题目描述假设图G采用邻接矩阵存储,分别设计实现以下要求的算法:1.输出每个顶点的入度2.输出每个顶点的出度3.求出度最大的一个顶点,输出其编号4.计算图中出度为0的顶点数5.判断图中是否有边<i,j> 解决思路1.入度是邻接矩阵中第i列的元素之和在函数InDegree()中,我们需要设置一个循环......
  • 27 | SIMD:如何加速矩阵乘法?
    00:00讲述:徐文浩大小:10.85M时长:11:50上一讲里呢,我进一步为你讲解了CPU里的“黑科技”,分别是超标量(Superscalar)技术和超长指令字(VLIW)技术。超标量(Superscalar)技术能够让取指令以及指令译码也并行......
  • Vue 单组件入门
    Vue基础入门一、Vue脚手架1.简介Vue的脚手架(VueCLI:CommandLineInterface)是Vue官方提供的标准化开发平台。它可以将我们.vue的代码进行编译生成htmlcssjs代码,并且可以将这些代码自动发布到它自带的服务器上,为我们Vue的开发提供了一条龙服务。脚手架官网地址:ht......
  • .NET入门相关学习
    2023年05月22日笔记项目信息实体添加新属性①类增加对应属性声明。②快捷键Ctrl+Shift+B生成新应用;或者终端指令dotnetbuild生成新应用。③对应Controller字段增加属性;View视图增加对应部件(Index/Create/Edit);更新 SeedData 类。④PMC中输入指令进行数据库模型迁移:Add-Mi......
  • Java入门9(HashSet,File文件类)
    HashSetjdk1.7之前,使用数组加链表的方式实现jdk1.8之后,在链表长度大于8并且数组长度超过32的情况下,会转成红黑树结构HashSet的本质是一个HashMap,它所有的value都是一致的,传入的参数作为key,因此HashSet中不允许重复数据存储的时候,键值对位于的数组位置,之和key的HashCode值有关......
  • Pandas 01 快速入门
    Pandas官方文档Pandas(/ˈpændəz/)是一个开源的、BSD许可的库,为Python编程语言提供高性能、易于使用的数据结构和数据分析工具。Pandas适合处理一个规正的二维数据,即有N行N列,类似于SQL执行后产出的,或者无合并单元格Excel表格。一、快速入门1、读取数据importpandasa......
  • IntelliJ IDEA上手这一篇就够了,从入门到上瘾
    前言每次换电脑,最最最头疼的事情莫过于安装各种软件和搭建开发环境。这算是不想换电脑的一个原因吧(最主要还是穷)。除非是电脑坏了开不了机或者点一下卡一下,真不想换电脑。每次换电脑都得折腾好久。趁着这次换电脑了,顺便整理下IDEA安装使用及配置。官网提供的详细使用文档,英......
  • React 入门实例教程
    现在最热门的前端框架,毫无疑问是 React 。上周,基于React的 ReactNative 发布,结果一天之内,就获得了5000颗星,受瞩目程度可见一斑。React起源于Facebook的内部项目,因为该公司对市场上所有 JavaScriptMVC框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站。做出......
  • Flutter入门资料推荐
    前言群里很多入门小白不知道如何入门Flutter,水一篇文章简单介绍下本人学习过程中一些参考资料,方便Flutter小白少走弯路。非权威,推荐只针对本人经验来的说,大佬们不喜勿喷!资料列表书籍类第二版序|《Flutter实战·第二版》dio作者写滴,资料还是有保证,介绍比较全面,Flutter内容基......
  • 杂项·入门
    Misc杂项MISC,中文即杂项,包括隐写,数据还原,脑洞、社会工程、压缩包解密、流量分析取证、与信息安全相关的大数据等。此处我详细描述图片隐写,文件修复,音频隐写和压缩包破解。图片隐写图片隐写又分为附加式的图片隐写、基于文件结构的图片隐写,基于LSB原理的图片隐写、基于DCT域的JP......