线性代数有什么用?学习线性代数的意义在哪?

听过只是为了锻炼思维和解方程组,而今天的计算机没什么不能算的。。。 学习线性代数的意义在哪? 线性代数之所以在许多自然科学与工程、技术中都有应用,是不…
关注者
7,373
被浏览
2,148,369

261 个回答

想了想,大家一般会对什么感兴趣呢?好吧,那就说一下游戏中是怎么使用线性代数的。

之前,先说一下我学线性代数的经历。很可惜,当时学的时候,无论是老师和书上几乎没有提及任何应用场景,而且互联网也没有现在这么发达。导致最初只把它当做解线性方程组的一个工具而已,后来,学习了各种变换,其实也只会解题而已,完全不知道有什么实际作用。

毕业了以后,从我接触的领域来说,线性代数甚至比高等数学的应用场景还要多,也让我有机会对线性代数有了更深刻的认识。

不仅仅线性代数,其实对于我们在大学学的很多基础课,都很难理解实际的用处,比如《复变函数》等。将一门知识讲复杂了很容易,但是讲容易了的确是非常难的,这需要极高的学识和深刻的理解。

所以如果你有幸听到杨振宁讲物理,其实并不会因为他是诺贝尔奖得主,内容就变得生涩难懂,反而会更加生动有趣;

你看了《曼昆经济学》,什么人能把经济学讲的这么通俗易懂?原来曼昆29岁就成为了哈佛最年轻的终身教授之一;

如果你有幸有这样的老师教,那恭喜你!但现实是,很多学校的老师其实并没有达到这样的高度,所以更没法将一门复杂的学科联系实际并通俗易懂的讲出来。

如果在找了各种资料还是搞不懂一门学科的情况下,建议你,先默认接受这种状况。即使不理解,先好好学扎实了,课后的练习题先都会做了。以后工作中遇到相关的问题了,查资料解决问题的过程中,你自然而然就有了更深刻的理解。最悲催的莫不如,当你查了资料,发现我只记得”线性代数“这四个字,而里面的内容已经完全记不得了。

现在互联网如此发达,害怕的不是个别知识的“盲点”,而是“盲维”。因为“盲点”很容易借助互联网查到并解决,而“盲维”,指的是你缺失了整个维度,你可能需要从头学起,甚至不知道用什么关键词搜索。

我不是什么线性代数的大家,只是现实中经常用到,希望我的这篇回答能让你对《线性代数》这门课有一些深入的了解。



如果不会《线性代数》,连最基本的游戏场景都无法建立。

游戏场景

我们先来看一下下面的游戏场景

可以看到,上面的游戏场景和我们人眼看到的真实世界是一样的,远处的树显得比近处的要小,而小路在远处消失于一点,也就是符合我们眼睛中真实的世界——近大远小。

这里问题来了,游戏中的场景是如何设计的呢?不可能按照眼睛中近大远小的场景去设计,否则不同的视角下无法处理,所以一定是按照真实世界的大小去设计。那么我们玩游戏的时候,真实的世界是如何模拟我们的眼睛呈现出透视效果呢?我们先来看下图

我们的眼睛在看3D世界的时候,可以把眼睛想象成一个点,投射出一个视椎体,之所以呈现出近大远小,是因为在视椎体中,远处的物体投射到近平面会变小。那么真实世界中眼睛的这种透视效果怎么用数学进行表示呢?这时候,线性代数就表现出它强大的作用了。

这里其实就对应了一种变换,将视椎体框出的区域(截头方锥体)转换成一个标准立方体,经过这种变换,近平面的物体相对远平面就会变大。

为什么要转换成一个标准立方体呢?因为我们的显示器是2D的,GPU检测其中的深度信息,然后可以直接采样靠近近平面的点,也就是不被遮挡的点,这样显示出来的点就是真实的透视效果。否则,直接用视椎体,图像就会发生扭曲。

好了,上面都是定性的分析,那么怎么利用“线性代数”来进行这种变换呢?这里就涉及到了透视变换。

{\displaystyle P ={\begin{bmatrix} \frac{2n}{r-l} & 0 & \frac{r+l}{r-l} & 0 \\ 0 & \frac{2n}{t-b} & \frac{t+b}{t-b} & 0 \\ 0 & 0 & -\frac{f+n}{f-n} & -\frac{2fn}{f-n} \\ 0 & 0 & -1 & 0 \\ \end{bmatrix}}}

其中n = near(近平面), f = far(远平面),l = left(做平面),r = right(右平面), t=top(顶平面),b=bottom(底平面)。

所以假设空间中有一个点 X ,经过上述的透视变换以后,点就变成 PX 。这样就完成了我们现实世界和眼睛中的世界中的变换,是不是特别神奇?原来模拟我们眼睛透视效果竟然是用了一个透视矩阵帮助我们完成的。

有人可能会有疑问,明明是3D空间,为什么上面的变换一列有4个元素呢?这就涉及到了下面我要讲的物体移动。

物体移动

游戏中一定会有移动的物体,这里的移动包括旋转(rotation)和平移(translation),那么我们怎么完成一个3D空间中物体的移动呢?

旋转和平移

我们一般可以将一个3D空间中物体的旋转拆分成欧拉角,也就是绕X轴,Y轴,Z轴3个轴的旋转。就和空间中任意一个点都可以通过 (x, y ,z) 来表示一样,空间中任何一个旋转都可以表示成 (\theta_{x},\theta_{y},\theta_{z}) 。简单起见,假设都分别旋转 \theta 角。那么如何用矩阵的方式进行表示呢?

{\displaystyle R_{x}(\theta )={\begin{bmatrix} 1 & 0 & 0 \\ 0 & \cos \theta & -\sin \theta \\ 0 & \sin \theta & \cos \theta \\ \end{bmatrix}}} \\ {\displaystyle R_{y}(\theta )={\begin{bmatrix} \cos \theta &0&\sin \theta \\ 0&1&0\\ -\sin \theta &0&\cos \theta \\ \end{bmatrix}}} \\ {\displaystyle R_{z}(\theta )={\begin{bmatrix} \cos \theta &-\sin \theta &0 \\ \sin \theta &\cos \theta &0 \\ 0 & 0 & 1 \\ \end{bmatrix}}}

如果空间中一个点 X ,如果按照如下顺序进行旋转

  1. X 轴旋转 \theta
  2. Y 轴旋转 \theta
  3. Z 轴旋转 \theta

则转换后的点为 R_{z}(\theta )R_{y}(\theta )R_{x}(\theta )X在实际游戏中,我们常常不会使用欧拉角,因为会产生Gimbol Lock的问题,所以我们一般会使用四元数的方式来进行旋转。但是欧拉角的方式是最容易理解的

如果进行平移呢?我们能否通过3x3的一个矩阵实现一个平移变换呢?

答案是不能。

旋转是一个线性变换,如果把旋转想象成基底(我们可以先把基底想象成坐标系)的旋转,则在线性变换的过程中,原点不会发生变化。

线性变换

但是平移变换会发生原点的变化,所以在3D空间中的线性变换无法达到平移的效果。那么我们如何利用线性变化达到旋转+平移(仿射变换)的效果呢?就是提高一维。

N维空间中的仿射变换可以转换成N+1维空间中的线性变换来实现。

上面这句话很重要。

所以我们首先要提高一维,首先将3维空间中的点提高成4维,然后利用线性变换达到平移的效果。

那么平移矩阵是什么呢?

{\displaystyle {T} ={\begin{bmatrix} 1 & 0 & 0 & X \\ 0 & 1 & 0 & Y\\ 0 & 0 & 1 & Z \\ 0 & 0 & 0 & 1 \\ \end{bmatrix}}}

其中 X, Y, Z 分别代表沿 X,Y,Z 轴移动的距离。

同理,上述旋转变换矩阵也得扩展成4维。

到此,我们知道了线性代数的知识可以帮助我们完成游戏场景的创建和场景中物体的移动。

你可能会说了,这里面的平移变换和旋转变换计算机会帮助我们处理,我们学习线性代数有什么作用呢?

计算机只是你思想的执行者,并不能帮助你思考。

在上面的游戏设计中,有下面两种变换方式

  • 先进行平移再进行旋转
  • 先进行旋转再进行平移

请问这两种变换结果是一样的吗?

如果你知道在矩阵乘法中 AB \neq BA ,也就是不满足交换律,那么上面的问题,你可能不用过多思考就能给出答案。所以,掌握好线性代数基础非常重要。

角色进入特定区域

如下图,游戏中有一个八卦阵,玩家控制的角色进入到八卦阵中,中间的怪兽立即发光。

八卦阵

如果你来设计这个游戏,如何检测一个角色进入到八卦阵中呢?试着将它简化为一个数学问题,把角色当成一个质点,就是如何判断一个点在一个八边形内?

更一般地,就是如何判断一个点在凸多边形内或凸多边形上?

点在凸多边形内

看起来好像很简单,不就是在一个多边形内吗?其实这个还真不简单。这里涉及到计算机图形学的知识,当然有很多判断方法,这里介绍一种利用线性代数的方法。

如果点O在多边形内部(如下图),我们将多边形顶点A-G和O点连起来,组成有序向量 \vec{AO}, ... , \vec{GO} 共7个向量。另外多边形的顶点顺时针连接,组成向量 \vec{AB}, \vec{BC}, ... , \vec{GA} 也组成7个向量。

点在凸多边形内

将上面两组向量两两配对,组成 (\vec{AO}, \vec{AB}), ... , ({\vec{GO}, \vec{GA}}) 共7组向量,我们看看每组向量有什么特点?是不是每组向量中的第1个向量都在第2个向量的顺时针方向?

比如 \vec{AO}\vec{AB} 的顺时针方向,\vec{DO}\vec{DE} 的顺时针方向。也就是如果O点在多边形内部,则每组向量中的位置关系是固定的,即第1个向量在第2个向量的顺时针方向。而且这个条件是充要的。

再看下图,如果点O在多边形外部,\vec{AO}\vec{AB} 的顺时针方向,但是 \vec{GO} 却在\vec{GA} 的逆时针方向,也就是说如果O点在凸多边形外,则每组向量中的位置关系是不固定的。

点在凸多边形外

好了,那我们怎么表示这种顺时针的位置关系呢?这就用到了线性代数中的行列式。我们知道行列式的几何意义是什么吗?

行列式的几何意义

如上图,我们有两个向量(1, 2), (-1, 1),组成的行列式为

\[ P_1 = \left|\begin{array}{bmatrix} 1 & -1 \\ 2& 1 \\ \end{array}\right| = 1 + 2 = 3 \]

这里面行列式的值就是由 \vec{OA}, \vec{OB} 组成的平行四边形的面积。

有人可能会有疑问,行列式有可能是负值,那么负值的含义是什么呢?于是我们将上面两个向量对调,重新组成行列式。

\[ P_2 = \left|\begin{array}{bmatrix} -1& 1 \\ 1 & 2 \\ \end{array}\right| = -2 - 1 = -3 \]

看到了吗,行列式的绝对值就是由两组向量组成的平行四边形的面积。而符号呢,代表了 \vec{OA}, \vec{OB} 的相对位置关系

我们可以参考下面的右手定则,如果 \vec{OA}\vec{OB} 的顺时针方向,则用行列式求出来的符号也就是叉乘出来的值就是正的,反之,符号就是负的。

右手定则

所以,我们竟然可以用线性代数中行列式的正负来表示两组向量的位置关系,从而能够表示一个点是否在一个凸多边形内或凸多边形上,进而判断角色是否进入八卦阵中。是不是特别的神奇?


其实“线性代数”的用处远不止于此,在“图像处理”,“机器学习”等领域都有非常广泛的应用,但是对于学生我觉得游戏更能让大家提高兴趣。

所以我也没介绍什么太高深的知识,尽量用通俗易懂的语言和生动的案例让大家明白“线性代数”在实际中的用处,而且涉及到的都是线性代数最最基本的概念,希望能让对"线性代数"还有些"迷茫"的人有些帮助。

另外,无论是什么专业,在学习数学的时候,都试着将学到的数学知识和生活联系起来,你可能会发现,数学中很多的思维竟然能指导我们的生活,让我们养成结构化思考的习惯。具体内容请参见我的另一篇回答。

最后,如果这篇回答让你对“线性代数”有了一些更深刻的理解,请帮忙点赞,谢谢。

“为什么学习线性代数?线性代数到底在讲什么?”刚接触这门学科的同学可能都会提类似的问题。简短的回答就是:

(1)我们所处的世界、宇宙太复杂了,很多现象都无法理解,更谈不上用数学去描述;

(2)有一些符合特定条件的复杂问题,可以转化为简单的线性问题,线性问题就完全可以理解、完全可以被数学所描述(怎么把复杂问题转为线性问题是别的学科要解决的,比如说微积分);

(3)线性代数就是研究怎么解决线性问题的。

简短的回答结束,下面会在该回答基础展开,给出更详细的阐述。

1 复杂的世界

举两个例子,展示下我们所处的世界、宇宙到底有多复杂。

1.1 三体

科幻小说《三体》描述了一个三体世界,这是一个周围有三个“太阳”的行星(这样的行星在宇宙中是有原形的):

在引力的作用下,三个“太阳”互相推拉,导致它们的运行轨迹十分复杂,这样的问题可以称为“三体问题”。其中的行星(下图中最小的球体),也就是三体世界被牵扯着四处运动:

这样导致的结果是,三体世界上的环境非常恶劣:如果三个“太阳”同时靠近它,那么温度就会非常高;三个“太阳”同时远离,则又变成冰封大陆;只有在三个“太阳”不远不近、不多不少的靠近它时,会有那么一段适合生物发展的时期。

在这样残酷的环境中,反复地毁灭和创造下,孕育出了比人类先进很多的三体文明。就是这样的先进文明也没有办法预测三个“太阳”的轨迹。有可能短暂地预测成功了,但是偶尔路过的彗星,或者远处的超新星爆炸等,又会给非常不稳定的三体系统带来搅动,导致运动轨迹重新变得扑朔迷离。

1.2 散热

三体的例子很遥远,下面来看一个生活中的例子。下面是电脑里面的显卡,左侧是显卡风扇。从动图中可以看出,工作中的显卡有的地方温度很高,风扇吹出来的风不断在给显卡降温:

由于各种器件的存在,以及气流的相互影响,导致风的运动非常复杂。假如要去计算某一时刻、某一点的风力大小和方向,可想而知难度会有多大。

2 简单的线性

相对于复杂的世界而言,线性问题是非常简单的。下面笼统说下什么是线性问题。

2.1 线性

有一类几何对象,比如立方体、直线、平面,看上去都是有棱有角的,都是“直”的,在数学中称为 线性 (这么说肯定不严格,可以暂时这么通俗地理解):

2.2 线性问题

要处理它们,以及和它们相关的问题就非常简单。比如在高中就学过,两根直线可以用两个线性方程来表示,想求它们交点的话:

联立出两者的方程组,求出该方程组的解就可以得到交点:

\begin{cases} a_{11}x_1+a_{12}x_2=b_{1}\\ a_{21}x_1+a_{22}x_2=b_{2} \end{cases}\\

这里举的例子很简单,随着后面的深入学习就会知道,线性问题还是有一定的复杂性,不然不会需要《线性代数》这门学科来研究线性问题。

3 复杂世界线性化

复杂的世界介绍了,简单的线性问题也介绍了,之前说了,某些复杂问题可以转为简单的线性问题,或者称为复杂问题可以 线性化 ,下面就来看几个例子。

3.1 静态

不规则曲线挺复杂的,不过在一定的条件下,x_0 点附近的曲线可以用一根直线来代替(这是《单变量微积分》中的内容):

不规则曲线也蛮复杂的,也是在一定的条件下,(x_0,y_0) 附近的曲面可以用一个平面来代替(这是《多变量微积分》中的内容):

3.2 动态

在5G通信中,会遇到各种各样复杂的周期波,我们可以通过正弦函数来近似这些周期波(这是《信号与系统》中的内容):

为什么要用正弦函数来近似?这是因为,如果将一根线段旋转一圈,记录该线段在y 轴上的轨迹,得到的就是正弦函数:

也就是说,正弦函数实际上是运动的线段,也是线性的。那么用正弦函数来近似周期波,就相当于将各种复杂的周期波的问题给线性化了。

4 人脸识别

之前的例子比较直觉,下面通过人脸识别给出一个具体的例子,虽然相对于真正的应用而言,这个例子已经极度简化了,大家还是可以看到是怎么通过线性化来解决像人脸识别这样的复杂问题的(下面的图片出自 这里)。

下图中,有两张照片是同一个人的:

对于这个问题,人是很容易分辨出来的,但计算机应该怎么办呢?其中一种方法就是将之线性化。首先,给出此人更多的照片:

将其中某张照片分为眼、鼻、嘴三个部位,这是人脸最重要的三个部位。通过某种算法,可以用三个实数来分别表示这三个部位,比如下图得到的分别是1503020

将所有这些照片分别算出来,用三维坐标来表示得到的结果,比如上图得到的结果就是(150,30,20) 。将这些三维坐标用点标注在直角坐标系中,发现这些点都落在某平面上,或该平面的附近。因此,可认为此人的脸线性化为了该平面:

将人脸线性化为平面后,再给出一张新的照片,按照刚才的方法算出这张照片的三维坐标,发现不在平面上或者平面附近,就可以判断不是此人的照片:

5 向量与矩阵

总结下,人脸识别就是把之前的人脸线性化为平面,然后判断新的照片是否在该平面内:

这里面有两个数学问题:

(1)怎么表示人脸线性化后的平面?

(2)怎么判断人脸是否在该平面内?

线性代数提供了这两个数学问题的解决方案。

5.1 向量和向量空间

第一个问题,怎么表示人脸线性化后的平面?线性代数提供了向量或向量空间来表示平面、直线以及立体等线性的几何对象:

5.2 矩阵函数

第二个问题,怎么判断人脸是否在该平面内?线性代数提供了关于向量和向量空间的函数,也就矩阵函数,或者简称为矩阵。这样可以很方便的判断出新的照片是否在之前线性化得到的平面上(下面的不等于就表示不在平面上):

6 线性代数

综上,线性代数要学习的内容就是如何解决线性问题(再重复一下,如何把复杂问题线性化是别的学科的内容,比如《微积分》、《信号与系统》等),大学的公共课《线性代数》课程包含以下内容:

  • 什么是向量、向量空间
  • 关于向量、向量空间的函数,也称为矩阵函数
  • 对矩阵函数进行坐标变换(之前没有提到这点,但是对于复杂的线性问题,需要进行坐标变换)

掌握了以上内容,才具备了处理复杂问题的部分基础能力,因此线性代数是工科、理科的必修科目。

跟着马同学,看图学数学,欢迎加入马同学图解数学课程