线性代数学习笔记

· · 个人记录

线性代数

矩阵与线性代数入门

线性代数方程组的表示

矩阵的本质

可以当作一个矩阵形式的数表看待,也可看成一组列向量。 向量的线性组合可以看成矩阵与向量的积。

理解 Ax = b

我的理解:

我认为这个的理解和反演与矩阵之间的理解差不多,可以将 A 视作关系矩阵,xA 的关系之下可以转化为 b

(当然如果 b 也可以在 A 的关系之下转化成 x ,我们可以成 A 矩阵是自逆的。在下文中会提到)

参考文献:家里有只肉丸子《直观理解!你一定要读一下的“矩阵和线性代数入门”》

矩阵运算

A = \begin{bmatrix} &a_{1, 1} &a_{1, 2} &a_{1, 3} \\ &a_{2, 1} &a_{2, 2} &a_{2, 3} \\ &a_{3, 1} &a_{3, 2} &a_{3, 3} \end{bmatrix} B = \begin{bmatrix} &b_{1, 1} &b_{1, 2} &b_{1, 3} \\ &b_{2, 1} &b_{2, 2} &b_{2, 3} \\ &b_{3, 1} &b_{3, 2} &b_{3, 3} \end{bmatrix}

加法

A + B = \begin{bmatrix} &a_{1, 1} + b_{1, 1} & a_{1, 2} + b_{1, 2} & a_{1, 3} + b_{1, 3} \\ &a_{2, 1} + b_{2, 1} & a_{2, 2} + b_{2, 2} & a_{2, 3} + b_{2, 3} \\ &a_{3, 1} + b_{3, 1} & a_{3, 2} + b_{3, 2} & a_{3, 3} + b_{3, 3} \\ \end{bmatrix}
运算律

交换律:A + B = B + A

结合律:(A + B) + C = A + (B + C)

减法

A - B = \begin{bmatrix} &a_{1, 1} - b_{1, 1} & a_{1, 2} - b_{1, 2} & a_{1, 3} - b_{1, 3} \\ &a_{2, 1} - b_{2, 1} & a_{2, 2} - b_{2, 2} & a_{2, 3} - b_{2, 3} \\ &a_{3, 1} - b_{3, 1} & a_{3, 2} - b_{3, 2} & a_{3, 3} - b_{3, 3} \\ \end{bmatrix}

数乘

A * k = \begin{bmatrix} &a_{1, 1} \cdot k &a_{1, 2} \cdot k &a_{1, 3} \cdot k \\ &a_{2, 1} \cdot k &a_{2, 2} \cdot k &a_{2, 3} \cdot k \\ &a_{3, 1} \cdot k &a_{3, 2} \cdot k &a_{3, 3} \cdot k \end{bmatrix}
运算律

结合律:k(vA) = v(kA)

k(vA) = (vk)A

分配律:(k + v) A = vA + kA

k(A + B) = kA + kB

转置

A 的行和列相互交换,得到的矩阵叫做 A 的转置矩阵,记号为 A^{T}

A^T = \begin{bmatrix} &a_{1, 1} &a_{2, 1} &a_{3, 1} \\ &a_{1, 2} &a_{2, 2} &a_{3, 2} \\ &a_{1, 3} &a_{2, 3} &a_{3, 3} \end{bmatrix}

这个玩意看起来就跟沿着左上右下的对角线扭过去一样。

共轭

我们知道共轭复数是这样子的:a + bi \longrightarrow a - bi

同样对于矩阵是这样子的:

A = \begin{bmatrix} & 3 + i & 5 \\ & 2 - i & 1 + 2i \end{bmatrix} \bar{A} = \begin{bmatrix} & 3 - i & 5 \\ & 2 + i & 1 - 2i \end{bmatrix}

乘法

C_{i, j} = \sum_{r = 1}^na_{i, r}b_{r, j}
C中第i行第j列的元素的值为:A中第i行的所有元素和B中第j列的所有元素对应相乘然后相加的值。

矩阵与向量相乘

将向量 \begin{bmatrix} x \\ y \end{bmatrix} 变成 \begin{bmatrix} -x \\ y \end{bmatrix} 的操作为:

\begin{bmatrix} &-1 & 0 & \\ & 0 & 0 & \end{bmatrix} \times \begin{bmatrix} x \\ y \end{bmatrix} = \begin{bmatrix} -x \\ y \end{bmatrix}

一个 n \times 1 的矩阵可以和一个 m \times n 的矩阵相乘。

矩阵表示向量的点积

\vec{a} \cdot \vec{b} = \vec{a}^T\vec{b} = \begin{bmatrix} x_a \space y_a \space z_a \end{bmatrix} * \begin{bmatrix} x_b \\ y_b \\ z_b \end{bmatrix} = \begin{bmatrix} x_ax_b + y_ay_b + z_az_b \end{bmatrix}

矩阵表示向量的叉积

\vec{a} \times \vec{b} = \begin{bmatrix} 0 & -z_a & y_a \\ z_a & 0 & -x_a \\ -y_a & x_a & 0 \end{bmatrix} * \begin{bmatrix} x_b \\ y_b \\ z_b \end{bmatrix} = \begin{bmatrix} 0 \cdot x_b - z_ay_b + y_az_b \\ z_ax_b + 0 \cdot y_b - x_az_b \\ -y_ax_b + x_ay_b + 0 \cdot z_b \end{bmatrix}

常用矩阵

单位矩阵

I_2 = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} I_3 = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} AI = A

逆矩阵

如果矩阵AAB = I,那么称 A 这个矩阵是可逆的,BA 的逆矩阵。

\begin{matrix} & (A^{-1})^{-1} = A \\ & \space\space\space\space\space\space\space (A^T)^{-1} = (A^{-1})^T \\ & \space\space\space\space\space\space\space\space\space\space (AB)^{-1} = B^{-1}A^{-1} \end{matrix}

对角矩阵

just \space like \begin{bmatrix} a & 0 & 0 \\ 0 & b & 0 \\ 0 & 0 & c \end{bmatrix}

这样这里的 a,b,c 不为 0。

对角矩阵的性质:A^T = A,并且矩阵为方阵。

应用
\begin{bmatrix} m & 0 \\ 0 & n \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} = \begin{bmatrix} mx \\ ny \end{bmatrix}

正交矩阵

由于 $AA^{-1} = I$,所以正交矩阵的转置等于其逆矩阵, $A^T = A^{-1}$。 $$ \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} $$ 单位矩阵也是正交矩阵。 摘自:[知乎:《矩阵运算与常用矩阵》作者:王江荣](https://zhuanlan.zhihu.com/p/362082020)。 建议参考书籍[线性代数Linear Algebra - 同济大学](https://zlibrary-china.se/book/5281826/afd8d4)来学习。 对于关系矩阵的更深层次的理解:[mjsdnz的博客,写的特别牛逼](https://mjsdnz.github.io/2023/08/19/%E6%B5%85%E8%B0%88%E5%85%B3%E7%B3%BB%E7%9F%A9%E9%98%B5/) # $OI相关

矩阵快速幂

额……其实跟普通快速幂的思想一样,在此放个代码。

struct Matrix
{
  int x, y;
  int mt[N][N];
  Matrix () { memset(mt, 0, sizeof(mt)); }
  Matrix (int x, int y) : x(x), y(y) {}
  Matrix operator*(const Matrix &o) const
  {
    Matrix res = Matrix(x, o.y);
    for (int i = 1; i <= x; i ++ )
      for (int j = 1; j <= o.y; j ++ )
        for (int k = 1; k <= y; k ++ )
          res.mt[i][j] += mt[i][k] * o.mt[k][j];
  }
};
Matrix qmi(Matrix &base, int t)
{
  Matrix ans; 
  for (int i = 1; i <= n; i ++ )
    ans.mt[i][i] = 1;
  while (t) {
    if (t & 1) ans = ans * base;
    base = base * base;
    t >>= 1;
  }
  return ans;
}

高斯消元

这个直接上代码吧。

赫的Pecco 的代码,他代码的码风好看,而且写的更加简洁。

Code—First:
for (int j = 0; j < n; ++j) // 枚举列
{
    int i;
    for (i = j; i < n; ++i) // 找到非0元素
        if (A[i][j])
            break;
    if (A[i][j] == 0) // 无解的情形
    {
        puts("No Solution");
        return 0;
    }
    for (int k = 0; k <= n; ++k) // 把非0元素所在行交换到当前行
        swap(A[i][k], A[j][k]);
    for (int k = n; k >= j; --k) // 把当前行除以A[j][j],令A[j][j]归一,注意循环顺序
        A[j][k] /= A[j][j];
    for (int i = 0; i < n; ++i) // 对其他行消元
        if (i != j)
            for (int k = n; k >= j; --k) // 注意循环顺序
                A[i][k] -= A[j][k] * A[i][j];
}
Code—Second:
// 高斯消元,把n行m列的矩阵化为行最简矩阵
for (int j = 0; j < m; ++j) // 枚举列
{
    int i;
    for (i = curi; i < n; ++i) // 找到非0元素
        if (A[i][j])
            break;
    if (A[i][j] == 0)
        continue;
    for (int k = 0; k < m; ++k) // 把非0元素所在行交换到当前行
        swap(A[i][k], A[curi][k]);
    for (int k = m - 1; k >= j; --k) // 把当前行都除以A[curi][j],令A[curi][j]归一,注意循环顺序
        A[curi][k] /= A[curi][j];
    for (int i = 0; i < n; ++i) // 对其他行消元
        if (i != curi)
            for (int k = m - 1; k >= j; --k) // 注意循环顺序
                A[i][k] -= A[curi][k] * A[i][j];
    curi++;
}

行列式

行列式的基本的知识:Click Here。

行列式求解:使用高斯消元搞一个上三角矩阵就可。

int cal(int n, int p) // 求行列式 
{
    int ret = 1, si = 1;
    for (int i = 1; i <= n; i ++ )
    {
        for (int j = i + 1; j <= n; j ++ )
            while (a[j][i])
            {
                int t = a[i][i] / a[j][i];
                for (int k = i; k <= n; k ++ )
                {
                    a[i][k] = (a[i][k] - t * a[j][k]) % INF;
                    swap(a[i][k], a[j][k]);
                }
                si *= -1;
            }
        ret = ret * a[i][i] % INF;
    }   
    return (ret * si % INF + INF) % INF; 
}

板子题目:行列式求值

范德蒙德行列式

D = \begin{vmatrix} &1 &1 &... &1 &1 \\ &x_1 &x_2 &... &x_{n - 1} &x_n \\ &x_1^2 &x_2^2 &... &x_{n - 1}^2 &x_n^2 \\ &x_1^3 &x_2^3 &... &x_{n - 1}^3 &x_n^3 \\ &...\\ &x_1^{n - 2} &x_2^{n - 2} &... &x_{n - 2}^{n - 2} &x_n^{n - 2} \\ &x_1^{n - 1} &x_2^{n - 1} &... &x_{n - 2}^{n - 1} &x_n^{n - 1} \end{vmatrix} D = \prod_{1 \le i \lt j \le n} (x_j - x_i)

(不会证明/kel)

拉普拉斯展开

拉普拉斯展开是一种将一个方阵的行列式表示为多个子行列式之和的方法。该方法利用了行列式的性质,在某些求解问题时非常有效。它的基本思想是选定某一行(列)作为公共项,将该行(列)上每一个元素与其所在的余子式相乘,然后相加所得到的结果即为该行(列)对应的代数余子式。

一个普通的行列式:

D = \begin{vmatrix} &a_{1,1} &a_{1,2} &... &a_{1,n - 1} &a_{1,n} \\ &a_{2,1} &a_{2,2} &... &a_{2,n - 1} &a_{2,n} \\ &a_{3,1} &a_{3,2} &... &a_{3,n - 1} &a_{3,n} \\ &a_{4,1} &a_{4,2} &... &a_{4,n - 1} &a_{4,n} \\ &... \\ &a_{n,1} &a_{n,2} &... &a_{n,n - 1} &a_{n,n} \end{vmatrix}

设一个行列式为这个样子:

D = \begin{vmatrix} & a_{1, 1} &... &a_{1, k} & & &0 \\ &... & &... & & & \\ & a_{k, 1} &... &a_{k, k} & & & \\ & c_{1, 1} &... &c_{1, k} &b_{1, 1} &... &b_{1, n} \\ &... & &... &... & &... \\ & c_{n, 1} &... &a_{n, k} &b_{n, 1} & &b_{n, n} \\ \end{vmatrix}

设:

D_1 = \begin{vmatrix} & a_{1, 1} &... &a_{1, k} \\ &... & &... \\ & a_{k, 1} &... &a_{k, k} \end{vmatrix} D_2 = \begin{vmatrix} &b_{1, 1} &... &b_{1, n} \\ &... & &... \\ &b_{n, 1} &... &b_{n, k} \\ \end{vmatrix}

D = D_1D_2

证明:

宏观上来看:

D = \begin{vmatrix} &D_1 &0\\ &D_3 &D_2 \end{vmatrix}

那么不难看出 D = D_1D_2

具体到每一个矩阵上:

我们可以讲 D_1、D_2、D 都通过高斯消元变成下三角矩阵。

D_1 = \begin{vmatrix} & p_{1, 1} &... &0 \\ &... & &... \\ & p_{k, 1} &... &p_{k, k} \end{vmatrix} D_2 = \begin{vmatrix} &q_{1, 1} &... &0 \\ &... & &... \\ &q_{n, 1} &... &q_{n, k} \\ \end{vmatrix} D = \begin{vmatrix} & p_{1, 1} & & & & &0 \\ &... & & & & & \\ & p_{k, 1} &... &p_{k, k} & & & \\ & c_{1, 1} &... &c_{1, k} &q_{1, 1} & & \\ &... & &... &... & &... \\ & c_{n, 1} &... &a_{n, k} &q_{n, 1} & &q_{n, n} \\ \end{vmatrix}

由此可见 D = \prod_{i = 1}^k p_{i, i} \prod_{j = 1}^n q_{j, j} = D_1D_2

定义:

余子式:M_{i, j} 表示去掉第 i 行,第 j 列 后的行列式。

通过上面的结论可以得出: $$ D = \begin{vmatrix} &a_{1,1} &0 &... &0 &0 \\ &a_{2,1} &a_{2,2} &... &a_{2,n - 1} &a_{2,n} \\ &a_{3,1} &a_{3,2} &... &a_{3,n - 1} &a_{3,n} \\ &a_{4,1} &a_{4,2} &... &a_{4,n - 1} &a_{4,n} \\ &... \\ &a_{n,1} &a_{n,2} &... &a_{n,n - 1} &a_{n,n} \end{vmatrix} $$ 此时 $D = a_{1,1}M_{1,1}$。 如果行列式变为这个样子: $$ D = \begin{vmatrix} &a_{1,1} &a_{1,2} &... &a_{1,n - 1} &a_{1,n} \\ &a_{2,1} &a_{2,2} &... &a_{2,n - 1} &a_{2,n} \\ &a_{3,1} &a_{3,2} &... &a_{3,n - 1} &a_{3,n} \\ &... \\ &0 &0 &a_{i, j} &0 &0 \\ &... \\ &a_{n,1} &a_{n,2} &... &a_{n,n - 1} &a_{n,n} \end{vmatrix} $$ 考虑将第 $i$ 行上移至第 $1$ 行,总共进行了 $i - 1$ 次交换;将第 $j$ 列左移至第 $1$ 列,总共进行了 $j - 1$ 次交换。得到了新的行列式 $D'$。 $$ D' = a'_{1, 1} M'_{1, 1} = a_{i, j}M_{i, j} = (-1)^{i + j - 2}D = (-1)^{i + j}D $$ $$ D = (-1)^{i + j}D' = (-1)^{i + j}a_{i, j}M_{i, j} = a_{i, j}A_{i, j} \space\space\space\space\space\space\space\space\space\space\space\space\space\space $$ 面对这种类型的行列式也可以采用这种方法进行操作: $$ D = \begin{vmatrix} &a_{1,1} &a_{1,2} &... &a_{1,n - 1} &a_{1,n} \\ &a_{2,1} &a_{2,2} &... &a_{2,n - 1} &a_{2,n} \\ &... \\ &a_{k,1} &a_{k,2} &... &a_{k, n - 1} &a_{k,n} \\ &...\\ &a_{n,1} &a_{n,2} &... &a_{n,n - 1} &a_{n,n} \end{vmatrix} $$ 可以讲第 $k$ 行每一项都提出来使得行列式 $D$ 变成 $n$ 个子行列式,类似这种样子: ($D_i$ 表示的是除了 $a_{k, i}$ 以外,第 $k$ 行其余的位置都为0的行列式) $$ D_i = \begin{vmatrix} &a_{1,1} &a_{1,2} &... &a_{1,n - 1} &a_{1,n} \\ &a_{2,1} &a_{2,2} &... &a_{2,n - 1} &a_{2,n} \\ &a_{3,1} &a_{3,2} &... &a_{3,n - 1} &a_{3,n} \\ &... \\ &0 &0 &a_{k, j} &0 &0 \\ &... \\ &a_{n,1} &a_{n,2} &... &a_{n,n - 1} &a_{n,n} \end{vmatrix} $$ 则: $$ D = \sum_{i = 1}^n D_i = \sum_{i = 1}^n a_{k, i}A_{k, i} $$ 这个好像是拉普拉斯展开的特殊形式? ## $线性基

矩阵求逆

矩阵树定理