线性代数 [ 序言 ]

线性代数

为什么要重新认识线性代数?

从这篇开始,我们一起学习线性代数。这一篇先把学习方向讲清楚:我们需要掌握哪些计算,这些计算又对应什么样的几何含义。后面遇到向量、矩阵、行列式时,我们会把公式和图像放在一起理解。

学习计算机、工程、统计学或者经济学,大家经常会接触到线性代数。比如计算机图形学中的旋转和缩放、统计学中的线性模型,以及我们前面接触过的向量嵌入与相似度计算,都离不开向量、矩阵这些基础工具。

但是,接触过这些工具,不一定代表我们已经理解了它们。

大家可以回想一下,第一次学习线性代数的时候,我们通常会做什么?计算矩阵乘法,展开行列式,求解线性方程组,再根据公式计算特征值、特征向量。题目做得多了,计算步骤也越来越熟练。

这时候,如果把问题换一下:矩阵乘法为什么要这样计算?行列式算出来的那个数,到底表示什么?特征向量又有什么特殊的地方? 我们就不一定能说明白了。

这里有一个非常关键的区别:能够按照规则完成计算,和能够解释这次计算的含义,是两件需要分别训练的事情。

数值计算与几何直观

我们先把理解线性代数的两个角度区分清楚:数值计算 和几何直观。

数值计算,重点关注的是具体怎么做。比如给定一个矩阵和一个向量,我们按照乘法规则,计算出新的向量;给定一个方阵,我们按照对应方法,计算出它的行列式。

几何直观,重点关注的是这个过程发生了什么。向量原来指向哪里,变换后又指向哪里?一个正方形经过变换后,面积扩大了还是缩小了?哪些向量在变换前后,仍然落在自己原来所在的直线上?

我们可以把它们放在一起对比:

理解角度 重点关注的问题 以矩阵作用于向量为例
数值计算 按什么规则运算,结果是多少? 计算向量变换后的坐标
几何直观 这个运算做了什么,结果意味着什么? 观察向量如何移动,平面如何变化

这里需要大家重点注意:这两个角度需要配合使用。 只有图像,我们可能知道大致发生了什么,却无法准确求出结果;只有计算,我们可能得到一组正确的数字,却不知道应该如何解释它。

比如后面遇到一个变换,我们从图上看到它把整个平面压到了一条直线上。即使还没有开始计算,也能先作出一个判断:不同的点可能会落到同一个位置,原来的信息无法全部恢复。

接下来再用矩阵、行列式和方程,把这个判断准确表达出来。这样,我们就把"看见的变化"和"算出的结果"联系起来了。

实际学习中,有时我们觉得老师或者同事特别厉害,好像一眼就知道应该使用什么方法。这里面有一个很重要的原因:他们能够从公式中识别出熟悉的结构,先判断这个问题大致在做什么,再选择对应的计算工具。

我们接下来要建立的,就是这样的联系。

先用正弦函数理解这件事

前面的说法可能还有一些抽象,我们先来看一下大家可能都知晓的正弦函数。

假设我们第一次接触正弦函数,学到的就是下面这个公式:

这里的 使用弧度。为了计算近似值,我们把一个数代进去,保留前面若干项,再完成加减运算。

比如取 ,只保留前三项:

这样当然能够得到一个很接近正确答案的数值。但是,如果我们只知道这套计算过程,却不知道正弦函数和角度、三角形、圆有什么关系,后面学习物理中的振动和波动时,依然可能不知道为什么要使用它。

接下来,我们换一个角度看。

在单位圆上,从正 轴转过角度 ,对应点的坐标可以写成:

也就是说,这个点的纵坐标,就是 。 当 时,这个高度是 ;当 时,点到达圆的最上方,高度就是 。

图中左边给出了计算近似值的方法,右边给出了这个值对应的几何含义。对于同一个 ,我们既能计算出它接近 ,也能在图上看到这个 对应的高度。

有了这样的联系,后面遇到周期变化,我们就更容易想到沿着圆运动的点,以及它不断变化的高度。至于具体数值需要精确到多少位,再交给计算过程完成。

线性代数也有这样的几何直观。 接下来,我们用一个很小的矩阵例子,先感受一下这种学习方式。

从一个矩阵开始,把计算和图像对上

下面的内容只是提前看一眼,大家暂时不需要掌握完整的矩阵理论。我们先观察一个问题:同样一次矩阵运算,能不能同时从数字和图像两个角度把它解释清楚?

先看数值计算

我们定义一个矩阵 ,再定义一个二维向量 :

按照矩阵与向量相乘的规则,用矩阵的每一行,与向量的对应分量相乘后相加:

到这里,我们已经把结果计算出来了:输入向量是 ,输出向量是 。

但是,我们还可以继续问一句:为什么这个矩阵会把 送到 ?它对其他向量又会做什么?

再看几何含义

我们把输入向量写成一般形式:

现在就能看清楚了:这个变换让纵坐标保持不变,把横坐标改成 。我们把平面中的每个点,都按照这个规则移动到对应的位置,就得到了下面的图像。

图中蓝色箭头表示我们关注的向量:左边是变换前的 ,右边是变换后的 。绿色和黄色箭头表示两个标准基向量及其落点,填色区域表示单位正方形及其变换后的形状。左右两图使用相同的坐标尺度。

大家可以先关注这两个标准基向量:

它们经过变换后,分别落在:

这两个结果,正好就是矩阵 的第一列和第二列。

原来的向量 可以写成 ​。线性变换保留向量的加法和数乘关系,所以它变换后的结果,也可以按照同样的系数组合:

这样,前面那套乘法规则就有了具体的解释:矩阵的各列记录标准基向量的落点,再根据输入向量的坐标,把这些落点组合起来。

这里展示的是矩阵与向量相乘。后面学习矩阵之间的乘法时,我们还会继续观察:连续进行两次变换,为什么能够对应到两个矩阵的乘积。

编写代码,验证向量的落点

了解完前面的图像和公式,我们接下来编写代码,把这个计算过程实际运行一遍。

这里使用 NumPy。它是 Python 中常用的数值计算库,能够帮助我们完成数组和矩阵相关的运算。如果当前环境没有安装,可以先在项目终端执行:

bash 复制代码
python3 -m pip install numpy

我们新建 Python 文件,命名为 preface_demo.py。第一步,导入 numpy,并使用 np.array() 创建矩阵和向量:

python 复制代码
import numpy as np

# 二维线性变换:x' = 2x + y,y' = y
matrix = np.array([
    [2.0, 1.0],
    [0.0, 1.0],
])

# 输入向量:横坐标为 1,纵坐标为 2
vector = np.array([1.0, 2.0])

这里的 matrix 是一个两行两列的数组,形状为 (2, 2)。vector 是一个包含两个元素的一维数组,形状为 (2, 1)。在当前的 matrix @ vector 运算中,它表示右侧输入的向量。

注意:数学公式里,我们把向量写成列向量;这里的一维数组本身没有行、列方向。 当前用法不需要额外改成 (2, 1),NumPy 能够直接完成这次矩阵与向量的乘法。

第二步,使用 @ 运算符计算结果:

python 复制代码
transformed = matrix @ vector

print("原始向量:", vector)
print("变换后的向量:", transformed)

运行代码,输出结果如下:

python 复制代码
原始向量: [1. 2.]
变换后的向量: [4. 2.]

我们可以看到,程序计算出的结果,与前面的手动计算完全对应。这里输出的 1.、2. 表示浮点数,不影响我们对坐标的理解。

接下来,再验证两个标准基向量的落点:

python 复制代码
e1 = np.array([1.0, 0.0])
e2 = np.array([0.0, 1.0])

print("第一个基向量的落点:", matrix @ e1)
print("第二个基向量的落点:", matrix @ e2)

输出结果:

python 复制代码
第一个基向量的落点: [2. 0.]
第二个基向量的落点: [1. 1.]

这就把矩阵里的数字、公式中的计算,以及图里的箭头位置对应起来了。

这里有一个需要提前说明的代码细节:对于 NumPy 数组,矩阵乘法使用 @,对应元素相乘使用 *。 matrix * vector 会按照广播规则进行逐元素乘法,得到的不是前面需要的那个向量。关于 @ 与 np.matmul() 的关系,可以查阅 NumPy 官方文档。

行列式,先理解它在描述什么

接下来,我们继续观察同一个矩阵。

前面图中的单位正方形,变换后成为一个平行四边形。它的底边长度是 ,高度是 ,所以面积从 变成了 。

再计算这个矩阵的行列式:

这两个数值正好对应起来:对于二维线性变换,行列式的绝对值,表示面积的缩放倍数。 当前行列式为 ,所以面积扩大到原来的 倍。

图中左边是我们一直使用的矩阵 ;中间换成关于 轴的镜像变换;右边则把所有点的纵坐标都变成 。这三个例子放在一起,可以帮助我们区分行列式的大小、正负与零值。

这里不能把行列式直接理解成面积本身。比如图中间的镜像变换,行列式为 ,面积仍然保持原来的大小,负号记录的是平面定向发生了翻转;图右边把正方形压到一条线上,面积变成 ,行列式也为 。

我们继续在前面的代码后面添加:

python 复制代码
determinant = np.linalg.det(matrix)
print(f"行列式:{determinant:.1f}")

输出结果:

复制代码
行列式:2.0

np.linalg.det() 用于计算方阵的行列式,具体接口可以查看 NumPy 官方说明。这里保留一位小数,是为了让显示结果更清楚,不能把格式化显示理解成提高了计算精度。

到这里,我们再看这个 2.0,就能解释它在当前例子中表示什么:变换后的面积,是原来面积的两倍。

特征向量,先观察特殊的方向

特征值到底代表什么?我们仍然用前面的矩阵,先看两个具体例子。

第一个向量,取水平方向的 :

我们可以看到,这个向量变成了原来的两倍,但仍然沿着原来的水平方向。

第二个向量,取 :

这个向量经过变换,位置和长度都没有改变。

像这样,一个非零向量经过矩阵作用后,结果仍然是它自身的某个倍数,就满足:

其中, 称为这个矩阵的特征向量 , 称为对应的特征值 。在当前例子中, 对应的特征值为 , 对应的特征值为 。

这个几何解释针对实数情形:当特征值为负数时,向量还会反向;当特征值为 时,向量会被压到原点。因此,直接说"特征向量的方向永远不变"并不准确。这里需要抓住的是结果仍然等于原向量乘上一个数。

我们也可以继续用代码检查刚才的两个等式:

python 复制代码
u = np.array([1.0, 0.0])
w = np.array([-1.0, 1.0])

print("A @ u:", matrix @ u)
print("2 * u:", 2 * u)

print("A @ w:", matrix @ w)
print("1 * w:", 1 * w)

输出结果:

python 复制代码
A @ u: [2. 0.]
2 * u: [2. 0.]
A @ w: [-1.  1.]
1 * w: [-1.  1.]

这里我们只是验证两个已经给出的向量,暂时没有讲如何求解特征值。后面需要自动计算时,可以使用 np.linalg.eig(),再把计算结果与几何图像对应起来。

还需要注意:并非每个实矩阵,在实数范围内都存在特征向量。 比如二维平面上绕原点旋转 的变换,就不会让任何非零实向量变成自身的实数倍。这部分我们留到对应章节再展开。

接下来,我们会学习哪些内容?

前面的矩阵例子,只是为了提前建立一个印象:线性代数里的数字,能够对应到具体的几何变化。正式学习时,我们仍然会从向量开始,把需要的基础逐步补齐。

结合这个系列的内容,我们可以先了解下面这些问题:

后续内容 我们重点理解的问题
向量 一个向量可以怎样理解,坐标又在记录什么?
线性组合、张成空间与基 给定几个向量,能够通过组合到达哪些位置?
矩阵与线性变换 一个矩阵如何描述向量和空间的变化?
矩阵乘法 连续进行两次变换,如何用一个矩阵表示?
行列式 面积、体积怎样变化,定向是否发生翻转?
逆矩阵、列空间、秩与零空间 哪些输出能够到达,哪些信息会在变换中丢失?
点积、叉积与基变换 如何理解投影、垂直关系,以及坐标描述的变化?
特征向量、特征值与抽象向量空间 哪些向量满足特殊的变换关系,这些运算还能推广到哪里?

大家暂时不需要记住所有名词。比如现在还不理解"零空间"或者"基变换",完全可以先放下。后面学到相应内容时,我们会先说明它要解决什么问题,再给出定义、公式和对应例子。

这里的学习顺序也有它的原因:理解向量和线性组合,才能更自然地解释矩阵的列;理解矩阵表示的变换,才能继续解释行列式、逆矩阵和特征向量。

前面的几何理解,会成为后面理解公式的基础。 所以遇到不熟悉的地方,我们可以回到前面的图像,检查自己是否理解了正在发生的变化。

这个系列应该怎样学习?

最后,我们再说明一下学习方法。

这个系列的重点,是帮助大家建立几何直观。完整的定义、证明和习题训练,仍然需要结合教材与课程继续学习。特别是高维空间和抽象向量空间,无法把每个对象都直接画出来,我们需要把二维、三维中形成的理解,逐步转化为准确的数学表达。

第一,看到关键图像时,可以先暂停,自己预测一下结果。

比如回到前面的矩阵,不运行程序,先想一想:向量 会落在哪里?向量 呢?我们可以先根据图像判断,再手动计算,最后用代码验证。

第二,运行代码之后,要能解释输出。

看到 [4. 2.],需要知道它是哪个输入向量的落点;看到行列式 2.0,需要知道它与面积变化的关系。如果只是把代码运行成功,却无法解释输出,那么这部分内容还需要回头再看。

第三,不要把"跟得上讲解"直接当成"已经掌握"。

看视频时,图像和结论都已经摆在面前,我们很容易觉得每一步都能理解。可以把视频或者文章暂时关掉,自己画出变换前后的两个基向量,再说明矩阵的两列为什么对应它们的落点。能够独立完成这个过程,才更容易在新的题目中使用这部分知识。

我们可以先做一个很小的练习:把代码中的 vector 改成 np.array([2.0, 1.0])。运行之前,先写下自己预测的结果;运行之后,再对照公式 、 解释为什么得到 。

这个练习不复杂,但它把预测、计算和解释连在了一起。后面学习新的内容时,我们也会继续采用这种方式。

学习前,再说明几个常见问题

没有学过线性代数,能直接开始吗?

可以从向量开始学习这组直观讲解,先熟悉平面坐标和基础代数运算。本文提前出现的行列式、特征向量,只用于展示后面会怎样理解它们,暂时不要求大家会求解。

已经有计算机了,还需要自己练习计算吗?

需要。规模较大的数值运算可以交给计算机,但我们仍然要理解基本规则,能够用小例子检查输入、运算顺序和输出。比如分清 @ 与 *,就需要知道自己实际想计算什么。

看懂这些图,就算学会线性代数了吗?

还需要继续练习。图像能够帮助我们建立理解,定义和证明帮助我们判断结论什么时候成立,习题则帮助我们把这些知识用到新的问题里。后续学习时,这几个部分需要一起推进。

到这里,序言部分就讲解完成了。下一篇,我们从最基础的问题开始:向量究竟是什么?


参考资料与配套内容

相关推荐
陈葛杰2 小时前
Adobe Premiere Pro2025安装教程
windows·adobe·开源软件·1024程序员节
杜哥无敌2 小时前
连接服务器干活的终端 / SSH 客户端工具大 PK
ssh·1024程序员节·云主机
apple_692658852 小时前
B站音乐播放器:鸿蒙与全平台可用的开源方案
1024程序员节
池央2 小时前
不同电脑和浏览器里的收藏怎么合到一起?Linkding提供了一套自托管书签方案
cpolar·1024程序员节
CHHH_HHH2 小时前
【Linux网络篇】初识网络与Socket编程基础
linux·服务器·c语言·开发语言·网络·后端·1024程序员节
zero_70322 小时前
linux复习作业
1024程序员节
xiangjiaodalishi2 小时前
武汉玖叁鹿科技:我们把 GEO 服务做成了可以审计的交付工程
python·1024程序员节
思麟呀2 小时前
BTree的原理与 C++ 完整实现
c语言·数据结构·c++·算法·1024程序员节
u1301302 小时前
AI 日报(2026年10月24日)
人工智能·1024程序员节