线性代数学习笔记

本文含有较多公式,请耐心等待渲染。

一、向量

定义

有大小、有方向的称为向量,记为 aa,向量可以任意平移。向量以有向线段的方式表示,有向线段有三要素:起点,方向,长度。

有向线段 AB 的长度称为它的模长,记为 |AB|。特别的,当模长为 0 的时候,这个特殊向量称为零向量,零向量的方向是任意的,长度始终为 0。

若两个非零向量 a,b 方向相同或相反,称这两个向量平行,记作 ab。对于多个互相平行的向量,我们可以找到一条直线,使得所有向量都能移动到该直线上,所以平行又可以称为共线

若已知两个向量 a,b,做 OA=a,OB=bAOB 即为向量 a,b夹角,记作 a,b。特别的,当 a,b=0 的时候,两向量同向,当 a,b=π 的时候,两向量反向,当 a,b=π2 的时候,两向量垂直

计算

对于向量的加法,我们可以类比力的合成,使用三角形公式平行四边形公式进行计算。

  1. 平行四边形公式,即若两个向量起点相同,则以两个向量为两边,做出一个平行四边形,他们的和的起点为两个向量的公共起点,终点为平行四边形内不与这两个向量相邻的端点。
  2. 三角形公式,即对于两个首尾相接的向量,做出一个以两个向量为两边的三角形,它们的和即为第三边。

对于向量的减法,可以类比数的减法,即 ab=a+(b)

二、线性代数简介

“线性”的来由

由于一次函数 y=kx 的函数图像是一条直线,故一次函数又称为线性函数。推广一下,所有类似这种 kx 乘法的变换都被称为线性变换

简单来说,域是带有符合运算律的加减乘除运算的集合。要求有 0,1,倒数、相反数存在,加、乘满足交换律、结合律、分配律。如有理数域 Q,实数域 R

域的判定

对于一个集合 F 和上述运算 +×,若 (F,+,×) 满足以下条件,则称其为一个域。

  1. 满足交换律,即 x,yF,x+y=y+x,x×y=y×x
  2. 满足结合律,即 x,y,zF,x+y+z=x+(y+z),x×y×z=x×(y×z)
  3. 满足分配律,即 x,y,zF,(x+y)×z=x×z+y×z
  4. 有加法、乘法逆元,即 xF,(x)F,x+(x)=0xF,(x1),x×(x1)=1
  5. 有单位元,即 0,1F,xF,0+x=x,1×x=x

线性空间

一般的,一个线性空间 V 基于一个域 F 定义,要求 V 内有加法运算,且 V 内的元素可以域 F 内的元素相乘,并且满足运算律。

如果 V 内有加法,域 FV 有乘法,满足以下条件则称 V 是 F-线性空间: V 内的加法满足交换律和结合律,有“0”,有“x” ,且满足结合律、交换律、分配律。

线性变换

顾名思义,线性变换指一个线性的一个空间到另一个空间的变换。

具体而言,应用这个变换应该有和乘以特定值类似的性质。

也就是上面线性空间的定义中,把乘法换成应用变换。

我们称一个变换 f:VW 是线性的,其中 V,W 都是 F-线性空间,当且仅当:

  • aF,vV,af(v)=f(av)
  • u,vF,f(u+v)=f(u)+f(v)

实际上,乘以一个数也是一个线性变换,平面上或者空间中的绕原点旋转是一个线性变换,针对单一分量的伸缩也是线性变换。

线性变换的复合

类似于函数的复合,我们定义线性变换的复合为先执行一个再执行另一个。容易验证,线性变换的复合结果仍然是线性变换。注意线性变换的复合不满足交换律,而且是从右往左执行

描述线性变换

既然有了线性变换,我们自然会想要讨论如何用尽量少的信息来描述一个线性变换。

我们记单位向量 ei 的第 i 维是 1,其他都是 0

那么对于每个向量 v=[v1v2vm],就可以表示为 v=i=1mviei,那么,对于变换 f 就有 f(v)=i=1mvif(ei),这样,我们就用每个 ei 的变换结果描述了整个线性变换。

进一步,如果我们在结果线性空间上取单位向量 fj(1jn),那么我们就可以用 n×m 个数 ai,j 表示这个线性变换,即 f(ei)=j=1nai,jfj,我们把所有 ai,j 写成 nm 列,这就是线性变换对应的矩阵了。

三、矩阵

定义

将一些元素排列成若干行,每行放上相同数量的元素,就是一个矩阵。这里说的元素可以是数字,例如以下的矩阵:

A=[114514]

矩阵乘法

两个矩阵 A,B 能够相乘,当且 A 的列数与 B 的行数相同。我们设 Am×n 的矩阵,Bn×p 的矩阵,那么他们的矩阵 C=ABm×p 的。

C 中的元素为:

Ci,j=k=1nAi,k×Bk,j

这就是矩阵乘法的定义。

实现

我们在 OI 中一般使用 O(n3) 的算法,即暴力乘法。

for (int i = 1; i <= m; ++i) 
    for (int j = 1; j <= p; ++j) 
        for (int k = 1; k <= n; ++k) 
            c[i][j] += a[i][k] * b[k][j];

实际上,最优的复杂度为 O(n2.373) 左右,但是由于常数很大,一般不这么使用。

矩阵乘法的性质

线性变换不满足交换律,矩阵乘法自然也不满足交换律。

不过,由于 (AB)CA(BC) 的意义都是按照 CBA 顺序执行线性变换,矩阵乘法是满足结合律的。

可以发现,矩阵乘列向量与矩阵乘一列的矩阵是一样的,因此列向量可以视为只有一列的矩阵。

单位矩阵

对于 n×m 的矩阵,它的单位矩阵大小为 m×m,对于 m×n 的矩阵,它的单位矩阵大小为 n×n

也就是说单位矩阵都是正方形的,这是因为只有正方形的矩阵能保证结果和前一个矩阵形状相同。

对于一个单位矩阵 e,他的定义为

i[1,n],ei,i=1

矩阵快速幂

对于一个 n×n 的方阵 A,求 Ak

矩阵快速幂与普通的快速幂几乎一样,稍微修改下代码即可通过。

struct M
{
    long long a[MAXN][MAXN] = {{0}, {0}};

    M operator*(M b)
    {
        M tmp;
        for (int i = 1; i <= n; ++i)
        {
            for (int j = 1; j <= n; ++j)
            {
                for (int k = 1; k <= n; ++k)
                {
                    tmp.a[i][j] = ((a[i][k] * b.a[k][j] % MOD) + tmp.a[i][j]) % MOD;
                }
            }
        }
        return tmp;
    }
} G;
M res;
void qp()
{

    for (int i = 1; i <= n; ++i)
    {
        res.a[i][i] = 1;
    }
    while (k)
    {
        if (k & 1)
            res = res * G;
        G = G * G;
        k >>= 1;
    }
}

四、矩阵加速递推

斐波那契数列

斐波那契数列 fn 满足 fn=fn1+fn2(n>2),f1=f2=1

我们发现这个递推式是线性的,因此可以使用线性变换描述。

具体的,我们将 fn+1,fn 写为一个矩阵,将 fn,fn1 写为一个矩阵。

[fn+1fn],[fnfn1]

我们想要通过一个矩阵 P,使得

[fn+1fn]=P[fnfn1](1)

由于 fn+1=fn+fn1,所以说我们要让 P 的第一行都为 1fn 在两个矩阵都出现了,所以直接令 P 的第 2 行、第 1 列为 1,第 2 行、第 2 列为 0 即可,也就是说

P=[1110]

将式子 (1) 无限递归下去,得到我们要求的 ft

[ft+1ft]=[1110]t[f1f0]

从特殊到一般

考虑总结出一个通用的递推式。

给定一个线性的递推关系式 fn=i=1kwifni,考虑求出这个式子的加速矩阵,其中 wi 是一个常量,代表权重。

那么,我们可以用以下这个式子来快速求出答案。

[v1v2v3vk100001000001][an+k1an+k2an+k3an]=[an+kan+k1an+k2an+1]

posted @   小蛐蛐awa  阅读(168)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示