大学里的数学不能说白学了,但也不好意思跟别人说自己学过。现在作为一个程序员,我“鼓起勇气”重新学习数学知识。 文章是我学习过程中的记录和体会,有时候会用程序的方式解决一些问题,而不是像上学那样为了考试而手工计算。 自己能力有限,文章中难免有片面甚至错误的地方,如果你发现了,非常感谢能为我指正。有不明确的地方也非常欢迎讨论。讨论让人进步。
介绍
本篇文章主要说明线性代数的一些基本概念,所以我们从线性代数的定义说起。关于线性代数,百度百科这样说:
线性代数是数学的一个分支,它的研究对象是向量,向量空间(或称线性空间),线性变换和有限维的线性方程组
维基百科:
线性代数是关于向量空间和线性映射的一个数学分支。它包括对线、面和子空间的研究,同时也涉及到所有的向量空间的一般性质
看不懂这些说明吗?没关系,我也看不懂。但从这些简短的说明可以看到几个关键名词:向量、线性空间、线性方程组。
不要纠结百科上的话。其实学习数学(或者其它任何东西)我们都不会从背定义开始,我们需要的是感受它外在,比如是什么样子,有什么性质,能做什么……,就像编程中的“鸭子类型”。
我的理解是,线性代数就是解决线性空间的问题。什么是线性空间呢?就是直来直去的空间,没有弯曲。有弯曲的就不是线性空间了,比如对于二次方程 $x^2 = y$ ,就不是线性的。
线性空间可以存在多个,如果觉得难理解,想像一下存在多个宇宙空间,而我们熟悉的三维空间所处的宇宙只是其中一个。 在线性空间里存在着一种东西叫向量,可以简单理解成一个有向线段(自然这个有向线段也是直的)。把一个向量从一个线性空间按一定规律映射到另一个线性空间时,就是矩阵的功能了。在映射过程中,“体积的扩大率”即为矩阵的行列式。
向量、矩阵就是线性代数的主角,配角是行列式。这三个概念也是这篇文章想要重点介绍的基本概念。
向量
什么是向量
我们已经说过,向量表示的是有方向的线段。那么我们先来看看在书写时向量长什么样子:
\[v=\begin{pmatrix}1\\2\\3\end{pmatrix}\]这就是一个三维列向量。从直观上来理解,列向量各行的值就是有向线段的终点在某个线性空间的坐标,比如上面的例子,终点坐标就是(1, 2, 3)。
注意上面这句话之所以可以这么说,是有非常强的前提条件的,那就是空间中要有坐标轴,并且有向线段的起点始终是原点。比如上面这个例子,只有$v$代表的有向线段起点在(0, 0, 0)时,终点坐标才是(1, 2, 3)。
你也可以说,向量就是一些值按列排起来。但这只是书写时的字面意义,在理解向量和进行计算时,有向线段这种表达非常方便和重要。
零向量是一个所有元素为零的向量,一般记作 $o$ 。
基向量
然而要让你失望了,数学家们总是追求简洁和通用的。所以在线性空间中,只有一个原点,没有坐标轴。但我们仍需要一个东西来表示一个“有向线段”(总不能每次提到某个向量时,都要用手指划一下吧)。因此我们选定一组基本的向量,当想表达某一向量时,都用这组基本的向量表示。这组向量我们称为基底。基底中的各向量一般用 $e_i$ 来表示, $e_i$ 叫做基向量。
基向量是我们自己随便选取的,没有谁规定某个线性空间的基向量必须是哪些。因此以后我们写出来的每一个向量(有向线段)的值,都是在某一组特定基向量下的值。当另选一组基向量时,同一向量的写出来的值就会不一样。
仍拿上面向量 $v$ 来说,实际上刚看到这个例子时,我们一下子就默认了它的基向量是三个垂直的坐标轴方向,因为我们对这种方式太熟悉了。那我们就沿用这种习惯,选取它的三个基向量:
或者我们也可以选取以下三个向量作为基向量:
\[e_1 = \begin{pmatrix}0.5\\0\\0\end{pmatrix} \quad e_2 = \begin{pmatrix}0\\0.5\\0\end{pmatrix} \quad e_3 = \begin{pmatrix}0\\0\\0.5\end{pmatrix}\]当使用不同的基向量时, $v$ 的各行并不总是(1, 2, 3)。也就是说$v$这个有向线段在本质上是不变的,但基底不同,表达出来的值也就不一样了。
虽然我们刚才说基向量是我们自己随便选取的,其实并不是那么“随便”,基向量的选取仍要遵守一定的规则:
基向量的选取规则:
- 当前空间中任一向量都可以使用基向量表示出来
- 这种表示方法是唯一的
只有满足了这两条规则,一组向量才能组成基底。通俗一点来说,基向量必须能张满整个空间。比如这组向量就不能作为基底,因为它们都在同一个方向( $x$ 轴),没有张满整个空间:
\[e_1 = \begin{pmatrix}1\\0\\0\end{pmatrix} \quad e_2 = \begin{pmatrix}2\\0\\0\end{pmatrix} \quad e_3 = \begin{pmatrix}3\\0\\0\end{pmatrix} \quad\]下面这组向量也不能作为基底,因为当它们作为基底时,同一组向量可以有不同的表示方法:
\[e_1 = \begin{pmatrix}1\\0\\0\end{pmatrix} \quad e_2 = \begin{pmatrix}0\\1\\0\end{pmatrix} \quad e_3 = \begin{pmatrix}0\\0\\1\end{pmatrix} \quad e_4 = \begin{pmatrix}0\\0\\2\end{pmatrix}\]这里 $e_4$ 是多余的,同一个向量即可以用 $e_1$, $e_2$, $e_3$ 表示,也可以用 $e_1$, $e_2$, $e_4$ 表示。
虽然我们说,当我们说到某个向量时,肯定是在特定基底下的表示,但每次说一个向量都要先说明一大堆基向量也太麻烦了。所以我们约定同一线性空间中,所有向量使用的都是同一基底。这样就不必每次说明基底了。为什么这样可以呢?虽然我们不知道这基底是什么,但我们知道这个线性空间中只用这个基底,那么基底是什么也就不那么重要了。
向量的运算
向量有两种运算:加法和数量乘法。先来看看加法:
\[a = \begin{pmatrix}a_0\\a_1\\\vdots\\a_n\end{pmatrix}\ b = \begin{pmatrix}b_0\\b_1\\\vdots\\b_n\end{pmatrix}\quad=>\quad a + b = \begin{pmatrix}a_0+b_0\\a_1+b_1\\\vdots\\a_n+b_n\end{pmatrix}\]例如:
\[a = \begin{pmatrix}1\\2\\3\end{pmatrix}\ b = \begin{pmatrix}10\\20\\30\end{pmatrix}\quad=>\quad a + b = \begin{pmatrix}11\\22\\33\end{pmatrix}\]数量乘法也非常简单:
\[a = \begin{pmatrix}a_0\\a_1\\\vdots\\a_n\end{pmatrix}\quad=>\quad ca = \begin{pmatrix}ca_0\\ca_1\\\vdots\\ca_n\end{pmatrix}\]例如:
\[a = \begin{pmatrix}1\\2\\3\end{pmatrix}\quad=>\quad 10a = \begin{pmatrix}10\\20\\30\end{pmatrix}\]向量运算的性质
向量的加法和数乘有一些简单的性质,罗列如下:
- $(cc^\prime)x = c(c^\prime x)$
- $1x = x$
- $x+y=y+x$
- $(x+y)+z = x+(y+z)$
- $x + o = x$
- $x + (-x) = o$
- $c(x+y) = cx + cy$
- $(c+c^\prime)x = cx + c^\prime x$
矩阵
什么是矩阵
从线性空间的角度来看,矩阵就是映射。
我们经常遇到 $y=f(x)$ 的表达,我们会说 $f$ 就是一个 $x$ 到 $y$ 的映射。同样的对于 $b = Aa$ 来说,我们可以看到向量 $a$ 经过一定的变换,变成了向量 $b$ ,这一变换是矩阵 $A$ 起的作用,因此 $A$ 在这里也就是一个映射了。
从线性方程组的角度来看,矩阵就是线性方程组各变量参数组成的方块。比如有以下线性方程组:
使用矩阵表示时就变成了这样:
\[\begin{pmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{pmatrix} \begin{pmatrix} x_1\\x_2\\x_3 \end{pmatrix} = \begin{pmatrix} y_1\\y_2\\y_3 \end{pmatrix}\]以映射的角度来看待矩阵,有助于我们理解逆矩阵的概念。关于逆矩阵下一小节会介绍,这里我想先说明一下映射塌陷的问题。首先看一个极端的例子:
\[令 A = \begin{pmatrix}0&0\\0&0\end{pmatrix} 则 对任意的x,都有Ax = 0\]这个例子中,矩阵 $A$ 的所有元素都为0,因此这个矩阵把线性空间中的所有点都映射到了 $(0, 0)$ 这个点。这就是映射塌陷。
当然这是一个极端的例子,一般来说,如果无法知道某个向量是从哪个向量映射而来的,就发生了映射塌陷。不同维度之间的映射都会发生塌陷,比如将一个3维平面映射到一个2维的直线,就会丢失一个维度的数据。相同维度之间的映射也可能发生塌陷,比如上面举的例子。
逆矩阵
对于一个不为0的实数 $x$ ,存在它的倒数 $\frac{1}{x}$ 使两者相乘得1。对于矩阵来说,也存在类似的概念,只不过我们称为逆矩阵而不是倒数。所以对于矩阵 $A$ ,如果存在一个矩阵两者相乘为单位矩阵 $I$ ,则称这个矩阵为 $A$ 的逆矩阵,记为 $A^{-1}$ 。
和0没有倒数类似,不是所有的矩阵都有逆矩阵。其实从映射的角度讲,逆矩阵也就是逆映射。结合前面讲的映射塌陷的概念我们可以想到,如果映射的过程没有发生塌陷,那么就肯定可以进行逆映射,将映射后的点完整映射回原来的点;如果发生了塌陷,那么肯定无法进行逆映射(因为总存在一些点你不知道它们是从哪来的,比如存在两个点 $x$ 和 $x^\prime$ ,经过映射以后都到了 $y$ 点,此时你无法进行逆映射,因为你不知道 $y$ 点是从 $x$ 点映射过来的还是从 $x^\prime$ 点映射过来的)。所以如果映射过程中没有塌陷问题,那么这个矩阵肯定存在逆矩阵。
由逆矩阵的映射方式我们可以得知,假设$A$存在逆矩阵,那么$AA^{-1} = I$成立。
另外逆矩阵还有以下性质:
- $\left(A^{-1}\right)^{-1} = A$ 。即矩阵的逆映射的逆映是它自己
- $(AB)^{-1} = B^{-1}A^{-1}$ 。对于先进行B映射到进行A映射,想要逆回去就要先进行A的逆映射再进行B的逆映射。
- $\left(A^k\right)^{-1} = \left(A^{-1}\right)^k$ 。进行了 $k$ 次映射以后想要逆回去,当然要进行 $k$ 次逆操作。
在python的numpy库中,可以使用矩阵的.I操作求得矩阵的逆。
转置矩阵
将矩阵的行列互换,就可以得到转置矩阵。转置矩阵记为 $A^T$ 。比如:
\[A = \begin{pmatrix}1&2&3\\4&5&6\\7&8&9\end{pmatrix}\quad\quad A^T = \begin{pmatrix}1&4&7\\2&5&8\\3&6&9\end{pmatrix}\]矩阵的运算
矩阵运算性质罗列如下(假设各算式中矩阵的维数是合适的):
- $(cA)x = c(Ax) = A(cx)$
- $(cA)B = c(AB) = A(cB)$
- $(cc^\prime)A = c(c^{\prime}A)$
- $A + B = B + A$
- $(A + B) + C = A + (B + C)$
- $(c + c^\prime)A = cA + c^{\prime}A$
- $A(B + C) = AB + AC$
- $(A + B)C = AC + BC$
- $(A+B)x = Ax + Bx$
特殊矩阵
零矩阵
所有元素都为0的矩阵称为零矩阵,一般记 $O$
单位矩阵
方阵中,对角线上的元素全中1,其它元素全是0,则称这个方阵为单位矩阵。单位矩阵专门使用 $I$ 来表示。
单位矩阵表示“什么都不做”的矩阵,因此 $Ix = x$ , $IA = A$ 。
对角矩阵
方阵中非对角线上的元素全为0时称该方阵为对角矩阵,例如:
由于大部元素都为0,因此对角矩阵也可以采用以下简记:
\[\begin{pmatrix} a_1 & & \\ & \ddots & \\ & & a_n \end{pmatrix}\]对角矩阵表示的映射是“沿坐标轴伸缩”,对角元素就是各轴伸缩的倍率。
行等价矩阵与初等矩阵
将矩阵按某些规则进行变换以后,得到的新矩阵与原来的矩阵是行等价的。变换规则有以下三种:
- 互换两行 . 2. 某行所有元素剩以一个非零常数。 . 3. 某行所有元素剩一个非零常后加到另一行上
这三种变换也叫做初等变换。 其实每一种变换,都可以使用矩阵的语言来表达。比如对于“互换两行”这个变换,可以通过左乘一个矩阵来达到目的:
\[A = \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{pmatrix} \quad \quad X = \begin{pmatrix} 0 & 1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{pmatrix}\]则
\[XA = \begin{pmatrix} 0 & 1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{pmatrix} = \begin{pmatrix} 4 & 5 & 6 \\ 1 & 2 & 3 \\ 7 & 8 & 9 \end{pmatrix}\]同样第二种、第三种变换也可以通过左乘某一个矩阵的方式达到目的。这里这个左乘的矩阵也叫做初等矩阵。你有没有发现初等矩阵其实就是单位矩阵只经过一次某种变换得到的矩阵。比如上面的$X$就是单位矩阵互换第一行和第二行得到的矩阵。
其实对于一组线性方程组,经过这三种变换后,线性方程组的解是不变的。所以这三种变换才能保持矩阵的行等价。
分块矩阵
用水平线和竖直线将矩阵的元素分隔成较小的矩阵,这些较小的矩阵组成一个矩阵,称为分块矩阵。 比如有以下矩阵 $A$:
\[A = \begin{pmatrix}1&2&3&4\\5&6&7&8\\9&10&11&12\\13&14&15&16\end{pmatrix}\]如果按以下的方式分块:
\[\left(\begin{array}{cc|cc} 1 & 2 & 3 & 4 \\ 5 & 6 & 7 & 8 \\ \hline 9 & 10 & 11 & 12 \\ 13 & 14 & 15 & 16 \end{array}\right)\]那么令
\[B= \begin{pmatrix} 1 & 2 \\ 5 & 6 \end{pmatrix} \quad C= \begin{pmatrix} 3 & 4 \\ 7 & 8 \end{pmatrix} \quad D= \begin{pmatrix} 9 & 10 \\ 13 & 14\end{pmatrix} \quad E= \begin{pmatrix} 11 & 12 \\ 15 & 16\end{pmatrix} \quad\]则矩阵 $A$ 可以表示成:
\[A = \begin{pmatrix}B & C \\ D & E \end{pmatrix}\]分块矩阵的运算与普通矩阵一样,只要小矩阵的维数符合运算规则。比如:
\[A = \begin{pmatrix}A_{11} & A_{12} \\ A_{21} & A_{22}\end{pmatrix} B = \begin{pmatrix}B_{11} & B_{12} \\ B_{21} & B_{22}\end{pmatrix}\]则
\[A + B = \begin{pmatrix} A_{11}+B_{11} & A_{12}+B_{12} \\ A_{21}+B_{21} & A_{22}+B_{22} \end{pmatrix}\] \[cA = \begin{pmatrix} cA_{11} & cA_{12} \\ cA_{21} & cA_{22} \end{pmatrix}\] \[AB = \begin{pmatrix} A_{11}B_{11}+A_{12}B_{21} & A_{11}B_{12}+A_{12}B_{22} \\ A_{21}B_{11}+A_{22}B_{21} & A_{21}B_{12}+A_{22}B_{22} \end{pmatrix}\]有一种特殊的分块矩阵,就是将每一行或每一列分块。例如:
\[A = \left(\begin{array}{c|c|c|c} x_{11} & x_{12} & \cdots & x_{1m} \\ \vdots & \vdots & & \vdots \\ x_{n1} & x_{n2} & \cdots & x_{nm} \end{array}\right) = (a_1, a_2, \cdots, a_m)\] \[B=\begin{pmatrix} x_{11} & \cdots & x_{1n^\prime} \\ \hline x_{21} & \cdots & x_{2n^\prime} \\ \hline \vdots & & \vdots \\ \hline x_{m^{\prime}1} & \cdots & x_{m^{\prime}n^{\prime}} \end{pmatrix} =\begin{pmatrix} b_1^T \\ b_2^T \\ \vdots \\ b_{m^{\prime}}^T \end{pmatrix}\]其中, $a_i$ 称为列向量, $b_i$ 称为行向量。
有时候使用列向量或行向量会特别方便,以后用到的时候会再做介绍。
行列式
一个矩阵的行列式通常写为 $det(A)$ 或 $|A|$ 。行列式可以用来判断矩阵是否存在逆,即当 $det(A) \neq 0$ 时, $A$ 存在逆矩阵。
在python的numpy包中,可以使用numpy.linalg.det函数求得矩阵的行列式。
行列式还有一些其它的应用,但现在还没有学到也没有用到,因此目前也没有深入学习。等以后用到我会再深入介绍。
总结
这是关于线性代数的第一篇,主要介绍了向量、矩阵的一些基本概念和性质。
长时间不接触,有些东西已经淡忘和模糊,所以文章也没法写得深入,自己也是一个学习者,是一个边学边写的过程。不过相信随着学得越来越多,很多知识点会慢慢串起来,变成习惯和“理所当然”,相信那时文章的内容会比较好吧。