ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

用MATLAB学好线性代数:从矩阵运算到特征值可视化

用MATLAB学好线性代数:从矩阵运算到特征值可视化 很多学线性代数的人都有过这种经历课上老师推导黑板上密密麻麻的符号作业里手算三阶矩阵的逆考试前背特征多项式和克拉默法则。考试能过但当手里真的有一批数据、一个方程组、一个需要判断“矩阵是否病态”的工程问题时突然发现自己不知道怎么把纸上的数学变成能跑起来的结果。这个问题的本质不是“线性代数没有用”而是我们太习惯用“手工计算”的方式去理解线性代数却很少用“程序语言”的方式去看它。实际上线性代数是一套描述数据关系、空间变换和系统状态的语言而这种语言最好的落地载体之一就是 MATLAB。这篇文章是“大谦MATLAB线性代数”系列里的基础篇目标是把线性代数最核心的概念和 MATLAB 命令一一对应起来。读完以后你能完成四件事创建矩阵并做基本运算用矩阵求解线性方程组计算特征值和特征向量把向量和线性变换画成图。更重要的是我会把那些新手最容易踩的坑一起讲清楚比如什么时候不该用inv、为什么det很小不代表矩阵一定不可用。如果你正在学线性代数准备数学建模或者在自动控制、图像处理、数据分析这类方向刚起步这篇文章会给你一份可以直接照着敲的 MATLAB 线性代数速通手册。1. 这篇文章真正要解决的问题先做一个直接的判断MATLAB 是目前学习线性代数概念时“反馈感”最强的工具之一。原因是 MATLAB 这门语言的设计起点就是矩阵。它不像 C 语言那样要先写双重循环才能做矩阵乘法也不像 Python 里需要先import numpy才能把“数组”当成“向量”来用。在 MATLAB 里矩阵是第一等公民打开软件输入一行代码就能看到结果这个“即时反馈”对建立空间直觉非常重要。这篇文章要解决的问题是三个非常具体的痛点第一个痛点是“数学符号不知道对应什么操作”。你看到A^T、|x|、det(A)、λ这些符号时知道它们代表转置、范数、行列式和特征值但不太确定在 MATLAB 里用什么函数、什么语法去表达。第二个痛点是“能手动算但不会用代码解”。三阶以下矩阵你还能手算但一旦到了五阶、十阶或者矩阵里是浮点数手算根本不现实。你需要知道 MATLAB 里x A \ b和x inv(A) * b的区别以及什么场景应该用哪一行。第三个痛点是“计算结果没有直觉判断力”。代码运行后得到一个特征值列表但这组数字到底在说什么矩阵变换之后图形变成什么样这些问题需要可视化来帮助理解而不是只看一个数字。所以这篇文章不只是给你一堆命令还会告诉你这些命令背后的数学含义、适用边界和常见陷阱。学完之后你再遇到“解一个线性系统”“判断矩阵是否可逆”“找出数据变化的主方向”这类问题会有一个清晰的操作路径。2. 为什么用 MATLAB 学线性代数三种方式对比在进入代码之前先花点时间回答一个很多人纠结的问题学线性代数用手算、用 Python、还是用 MATLAB我的观点是要建立几何直觉和快速验证MATLAB 是目前最省事的工具。这不是说 Python 不行而是说 MATLAB 的交互方式更贴合“边算边看”的学习过程。先说手算。手算的好处是能理解运算过程比如按行展开计算行列式、高斯消元解方程组。但它的缺点也很明显只能处理低阶矩阵容易出错而且完全无法建立“矩阵是变换”这种几何直觉。你算完一个四阶行列式得到的只是一个数但你不知道这个数在空间中代表什么。再说 Python 配合 NumPy。NumPy 的性能很强生态也很丰富但学习线性代数时你需要先处理“数组维度”“广播机制”“np.dot和np.matmul的区别”这类额外的语言概念。如果你本来就在学 Python那用 NumPy 完全合理但对于只想快速验证线性代数概念、或者数学建模刚入门的同学MATLAB 的语法更接近数学语言的书写习惯。最后说 MATLAB。它有几个对线性代数学习特别友好的特性所有变量本质都是矩阵[1 2 3]和[1; 2; 3]直接就有行列语义不需要区分“数组”和“矩阵”。内置了大量线性代数函数transpose、det、rank、inv、eig、svd不需要额外安装包。自带强大的可视化函数plot、quiver、plot3可以快速把向量和变换画出来。命令窗口交互式执行输入一行命令立刻看到结果特别适合“如果我把矩阵改一下特征值会怎么变”这种探索式学习。下面用一张表总结它们的差异对比维度手算Python NumPyMATLAB矩阵乘法表达逐项手算np.dot(A, B)A * B解线性方程组高斯消元np.linalg.solve(A, b)A \ b特征值计算特征多项式np.linalg.eig(A)eig(A)可视化无matplotlib需额外配置quiver、plot直接用学习曲线低但只适合低阶中等需先学语言较低语法贴近数学适合场景理解运算过程工业级数据处理概念验证和数学建模这里要强调一下我说“MATLAB 适合学线性代数”不等于“只在 MATLAB 里学数学”。你在 MATLAB 里看到的特征值、奇异值、矩阵分解这些概念和数学教材里是完全一致的换到 Python 或者 Julia 里只是换个函数名思想没有变。所以放心用 MATLAB 做验证之后再去接触其他工具概念是通用的。3. 环境准备与前置条件接下来进入实操。第一步是准备好 MATLAB 环境。先说版本。本文所有代码都使用 MATLAB 的基础语法不依赖任何特定工具箱所以在常见版本中都可以直接运行。如果你用的是学生版、教育版或者学校的机房版本也没有关系下面这些命令都内置在 MATLAB 核心环境里。由于不同大版本的界面布局略有差异本文重点演示通用操作思路版本细节请以你自己机器上的实际版本为准。安装完成后建议做两件事在主界面的“命令行窗口”里输入ver确认 MATLAB 能正常启动并看到版本信息。输入doc打开帮助文档界面后续查找函数用法时可以快速查证。如果你刚接触 MATLAB还需要先理解两个最基本的操作第一个是“分号抑制输出”。在命令行里输入a 1并按回车MATLAB 会立刻显示a 1。如果输入a 1;就不会显示任何输出。写脚本时如果不加分号程序运行后窗口会被大量中间结果刷屏。所以一个非常通用的习惯是在语句结尾加英文分号想查看某个变量的值时就单独输入变量名。第二个是“行内注释”。注释用百分号%开头它后面的内容不会被 MATLAB 执行。示例代码中出现的%注释你自己动手时可以直接复制也可以改成自己的说明文字。另外我建议不要只在命令窗口里敲命令。更好的做法是新建一个脚本文件% 文件路径demo_basic.m A [1 2; 3 4]; % 创建一个 2x2 矩阵 disp(A); % 在命令窗口显示矩阵 A新建脚本的方式是点击主页选项卡里的“新建脚本”或者直接按快捷键CtrlN然后把代码粘贴进去保存为.m文件最后点击“运行”按钮。用脚本文件的好处是你随时可以修改参数重新运行不会因为命令窗口里的历史记录太多而找不到之前的操作。4. 核心概念与 MATLAB 对应命令这一节把线性代数的核心概念和 MATLAB 命令做一个对应表。这些概念是后面所有代码的基础所以我会先简单解释数学含义再给出命令和一个小例子。4.1 矩阵与向量线性代数中的“矩阵”就是一个按矩形排列的数表。向量可以看成只有一列或一行的特殊矩阵。MATLAB 里创建矩阵非常直接A [1 2 3; 4 5 6; 7 8 9]; % 3 行 3 列矩阵 v [1; 2; 3]; % 列向量 w [1, 2, 3]; % 行向量这里的规则是同一行元素用空格或逗号分隔不同行用分号分隔。注意分号一定是英文输入法下的分号而不是中文全角分号。4.2 转置、内积与范数转置就是矩阵行列互换数学符号是A^T。在 MATLAB 里用单引号A表示。列向量和行向量的内积也叫点积可以用dot(v, w)计算。范数表示向量长度用norm(v)计算默认是二范数也就是向量各分量平方和的平方根。A [1 2; 3 4]; disp(A); % 转置结果 v [1; 2]; w [3; 4]; disp(dot(v, w)); % 内积 1*3 2*4 11 disp(norm(v)); % 长度 sqrt(1^2 2^2) 2.23614.3 线性方程组线性代数里最经典的题目就是解线性方程组写成一式就是A * x b其中A是系数矩阵b是常数向量x是未知数向量。MATLAB 解这类方程组最标准的写法是x A \ b;这里用到的运算符是“左除”\。它的数学含义是“从左边解A乘以x等于b”。对应的还有“右除”/但实际使用频率低很多主要在求解x * A b这种形式时才用。左除A \ b和inv(A) * b在数学上等价但实际结果可能差别很大。原因我放在后面的最佳实践章节详细说这里先记住结论解线性方程组优先用\不要用inv。4.4 行列式、秩与条件数行列式det(A)是一个标量常用于判断矩阵是否可逆或者计算体积变化比例。但对计算机来说det并不适合直接用来判断数值上的“是否可逆”因为浮点计算下det非常接近 0 并不能严格说明矩阵奇异。矩阵的秩rank(A)表示矩阵线性无关的行或列的数量。满秩的方阵才是可逆的。条件数cond(A)衡量矩阵对误差的敏感程度。条件数越大说明方程组越“病态”小扰动会带来大误差。A [1 2; 2 4]; disp(det(A)); % 结果很接近 0矩阵秩为 1 disp(rank(A)); % 1 disp(cond(A)); % Inf 或极大值说明矩阵接近奇异这个例子里的矩阵两行成比例是一个不可逆矩阵。从rank和cond上看非常明显但从det的数字上反而不直观。4.5 特征值与特征向量特征值和特征向量是线性代数里最容易被考试“考糊”但实际应用最广的概念之一。定义是这样对于矩阵A如果存在一个非零向量v和一个实数或复数λ满足A * v λ * v那么λ是矩阵A的特征值v是对应于λ的特征向量。在 MATLAB 里用eig函数A [2 1; 1 2]; [V, D] eig(A);结果中V的每一列是一个特征向量D是一个对角矩阵对角线上的元素就是特征值。关于特征向量的一个重要直觉是当矩阵作用于特征向量时结果向量的方向不变只是长度按特征值的比例缩放。如果特征值是 2向量会被拉长一倍如果特征值是 -1方向会反向。这个直觉用可视化最容易理解我会在第 6 节里给出完整代码。4.6 矩阵运算的注意事项MATLAB 中矩阵乘法A * B是标准的线性代数乘法要求A的列数等于B的行数。如果你想做“对应元素相乘”需要用点乘操作符.*这也是新手最容易搞混的地方。A [1 2; 3 4]; B [1 1; 1 1]; C1 A * B; % 矩阵乘法 C2 A .* B; % 对应元素相乘这两者结果完全不同。矩阵乘法关心行列之间的组合关系对应元素相乘只是普通投影运算。后面的代码示例中如果看到*和.*一定要分清它们的使用场景。5. 完整示例从矩阵运算到线性方程组求解下面用两个实际场景把前面讲的概念串起来。第一个场景是“创建矩阵并做基本运算”第二个场景是“解一个真实的线性方程组”。5.1 示例一矩阵创建与基本运算新建一个脚本文件demo_matrix_ops.m输入以下代码% 文件路径demo_matrix_ops.m A [1 2; 3 4]; B [5 6; 7 8]; fprintf(A B:\n); disp(A B); fprintf(矩阵乘法 A * B:\n); disp(A * B); fprintf(A 的转置 A:\n); disp(A); v [1; 2]; fprintf(向量 v 的二范数: %.4f\n, norm(v)); fprintf(向量 v 所有分量的平方和: %.4f\n, v * v);运行脚本后你会看到类似这样的输出不同版本小数位数可能有差异A B: 6 8 10 12 矩阵乘法 A * B: 19 22 43 50 A 的转置 A: 1 3 2 4 向量 v 的二范数: 2.2361 向量 v 所有分量的平方和: 2.2361这里要注意一个容易看错的地方代码里A表示矩阵转置但因为转置符号在字符串中间出现了所以写成了A来打印一个带单引号的字符串。这段代码的核心逻辑是比较norm(v)和v * v它们数值相等说明向量二范数的定义恰好是向量与自身内积的平方根。通过这样一个最小示例你就把“矩阵运算”“转置”“内积”“范数”这几个概念全部跑通了。5.2 示例二解线性方程组第二个场景是解一个线性方程组。假设有一个系统满足2*x1 x2 5 x1 3*x2 6把它写成矩阵形式就是A [2 1; 1 3];b [5; 6];新建脚本demo_linear_system.m% 文件路径demo_linear_system.m A [2 1; 1 3]; b [5; 6]; % 方法一左除推荐 x1 A \ b; % 方法二inv 矩阵求逆不推荐 x2 inv(A) * b; fprintf(左除结果 x1:\n); disp(x1); fprintf(inv 结果 x2:\n); disp(x2); fprintf(残差范数 norm(A*x1 - b): %.6e\n, norm(A * x1 - b)); fprintf(残差范数 norm(A*x2 - b): %.6e\n, norm(A * x2 - b));预期输出是左除结果 x1: 1.8000 1.4000 inv 结果 x2: 1.8000 1.4000 残差范数 norm(A*x1 - b): 0.000000e00 残差范数 norm(A*x2 - b): 0.000000e00解释一下x1 A \ b是 MATLAB 推荐的方式它会根据矩阵的数值性质自动选择合适算法。x2 inv(A) * b理论上结果一样但多算了A的逆矩阵计算量更大数值稳定性也更差。在大型矩阵中这种差异会非常明显。残差norm(A*x - b)用来衡量求解精度。理想情况下它应该是 0由于浮点运算的限制它会是一个很小的数比如1e-16量级。如果残差很大说明代码里矩阵或向量写错了。这里的判断技巧是只要残差在1e-10以下就可以放心认为求解成功。如果残差达到0.1或者更大优先回头检查A和b的输入是否有维度或符号错误。6. 完整示例特征值与特征向量的计算与验证特征值和特征向量是 MATLAB 线性代数应用的高频区域很多实际问题最后都会落脚到“求一个矩阵的特征向量”。下面通过一个对称矩阵例子演示完整流程。6.1 用 eig 计算特征值和特征向量新建脚本demo_eig.m% 文件路径demo_eig.m A [2 1; 1 2]; % 方式一只返回特征值向量 lambda eig(A); fprintf(特征值:\n); disp(lambda); % 方式二同时返回特征向量矩阵 V 和特征值对角矩阵 D [V, D] eig(A); fprintf(特征向量矩阵 V每列是一个特征向量:\n); disp(V); fprintf(特征值对角矩阵 D:\n); disp(D); % 验证第一个特征向量的性质 lambda1 D(1, 1); v1 V(:, 1); lhs A * v1; rhs lambda1 * v1; fprintf(第一个特征值: %.4f\n, lambda1); fprintf(A*v1 与 lambda1*v1 的最大误差: %.6e\n, max(abs(lhs - rhs)));运行结果会类似特征值: 1 3 特征向量矩阵 V每列是一个特征向量: -0.7071 0.7071 0.7071 0.7071 特征值对角矩阵 D: 1 0 0 3 第一个特征值: 1.0000 A*v1 与 lambda1*v1 的最大误差: 2.220446e-16这段代码有几个重要细节[V, D] eig(A)中D的对角线是特征值V的列是对应的特征向量。特征向量矩阵的每一列需要和特征值一一对应不要看错行列。验证A*v1 λ1*v1时误差在1e-16量级这是浮点运算的正常表现完全可以认为等式成立。如果A是不对称矩阵特征值可能是复数eig也能返回复数结果此时特征向量的元素也会出现虚部这是正常的。6.2 用图像理解特征向量的“方向不变性”只看数字还不够“线性代数”。下面这段代码会把特征向量的方向画出来可以直观看到当矩阵作用到特征向量上时结果向量的方向保持不变。% 文件路径demo_eig_visual.m A [2 1; 1 2]; [V, D] eig(A); v1 V(:, 1); v2 V(:, 2); % 计算变换后的向量 Av1 A * v1; Av2 A * v2; figure; hold on; % 原始特征向量实线 quiver(0, 0, v1(1), v1(2), 0, b, LineWidth, 2); quiver(0, 0, v2(1), v2(2), 0, r, LineWidth, 2); % 变换后的向量虚线 quiver(0, 0, Av1(1), Av1(2), 0, b--, LineWidth, 2); quiver(0, 0, Av2(1), Av2(2), 0, r--, LineWidth, 2); grid on; axis equal; xlim([-2 2]); ylim([-2 2]); legend(特征向量 v1, 特征向量 v2, A*v1, A*v2, Location, best); title(特征向量的方向在矩阵变换后保持不变);运行这段代码后你会看到两个特征向量的实线箭头和它们变换后的虚线箭头分别重叠在两条直线上。蓝色和红色虚线只是把实线等比拉长了方向没有改变。这就是特征向量“方向不变”的几何意义。这里用到了quiver函数它的基本语法是quiver(x, y, u, v);其中(x, y)是箭头起点(u, v)是箭头方向向量。第 5 个参数0表示禁止 MATLAB 自动缩放箭头这样代码中给出的长度就是真实长度。如果你不做这个设置quiver 默认会把所有箭头缩放到差不多的长度就看不出“拉长”效果了。7. 完整示例用向量可视化理解线性变换特征值只是一个方面线性代数的另一个核心思想是“矩阵是一个线性变换”。一个矩阵可以把平面里的点拉伸、旋转、剪切或压缩。理解这个思想比死记硬背矩阵乘法规则有用得多。下面这段代码演示一个最简单的剪切变换。矩阵A [1 0.5; 0 1]的作用是保持y坐标不变但把x坐标加上0.5 * y的偏移。% 文件路径demo_transform_visual.m v [2; 1]; A [1 0.5; 0 1]; w A * v; figure; hold on; quiver(0, 0, v(1), v(2), 0, b, LineWidth, 2); quiver(0, 0, w(1), w(2), 0, r, LineWidth, 2); grid on; axis equal; xlim([0 3]); ylim([0 3]); legend(原始向量 v, 变换后向量 A*v, Location, best); title(矩阵 A 对向量 v 的线性变换);运行后你能直观看到蓝色的原始向量方向在y方向没有变化但到了红色的变换后向量x方向被“推”了一下。这个可视化过程就是线性变换的几何意义。顺着这个思路继续走一步。如果你想看整个平面如何被矩阵变换可以画一个单位正方形的变换效果% 文件路径demo_transform_square.m sq [0 0 1 1 0; 0 1 1 0 0]; A [1 0.5; 0 1]; sqA A * sq; figure; hold on; plot(sq(1, :), sq(2, :), b-o, LineWidth, 2); plot(sqA(1, :), sqA(2, :), r-o, LineWidth, 2); grid on; axis equal; xlim([-0.5 2]); ylim([-0.5 2]); legend(原始正方形, 变换后图形, Location, best); title(矩阵 A 对单位正方形的线性变换);这里把正方形的四个顶点拼成一个2×5矩阵sq每一列是一个顶点的坐标。用矩阵A去乘sq等于同时对四个顶点做变换。结果显示出来的红色图形是一个被剪切的平行四边形这就是“矩阵是线性变换”的直观证据。这两个可视化示例并不复杂但非常值得自己动手跑一遍。它们能帮你在脑子里建立一种“看到矩阵就去想空间变换”的本能这种本能对后续学习主成分分析、控制系统状态空间、图像仿射变换等应用非常有帮助。8. 常见问题与排查思路在实际学习和使用中最容易卡住你的往往不是数学概念而是一些看起来很小的问题。下面整理了一张排查表建议收藏备用。问题现象可能原因排查方式解决方案运行inv(A)*b报告矩阵必须为方阵矩阵不是方阵或者写错了尺寸用size(A)、size(b)检查维度确认方程组Axb是否真的方阵或改用左除\矩阵结果显示太长窗口刷屏语句末尾没有加分号检查脚本中是否漏掉;在语句末尾加英文分号需要看值就单独输入变量名eig结果顺序和教材不一致eig不保证特征值排序查看diag(D)的排序方式按需求用sort或max提取特征值不要依赖固定顺序det(A)很接近 0 但求解仍有警告矩阵接近奇异但det判断不可靠查看cond(A)、rank(A)优先使用cond和rank判断对病态矩阵考虑pinvA*x和b相差很大左除和右除用反了检查A*x与b的矩阵乘法维数明确Axb用左除x A \ b变量名和 MATLAB 内置函数冲突用了eig、det等做变量名输入which eig查看解析结果避免用内置函数名作为变量名例如改用my_eig输入代码后报错提示中文符号标点符号用了全角查看报错位置附近是否有中文逗号、分号切换英文输入法检查所有分号和引号大型矩阵运算非常慢循环里反复创建变量或使用符号计算用profile分析代码耗时用数值矩阵代替符号矩阵使用向量化操作或预分配数组下面针对几个最常见的问题再展开说一下排查思路。8.1 关于det(A)判断矩阵是否可逆很多教材里说“行列式等于 0矩阵不可逆”。这句话在理论上是对的但在计算机浮点数环境里要小心。由于浮点误差一个本来可逆的病态矩阵它的det可能只是一个非常小的数比如1e-20。如果你只用det判断会误以为矩阵不可逆。更稳妥的做法是看条件数cond(A)。条件数越大矩阵对误差越敏感。如果cond(A)是Inf说明矩阵精确奇异如果cond(A)是一个大于1e15的数说明矩阵已经非常病态求解结果可能不可信。8.2 关于\和inv的选择解Ax b时x A \ b和x inv(A) * b在数学上等价但数值上差别可能很大。原因是inv(A)需要显式求逆矩阵这一步既增加计算量也会放大浮点误差。而A \ b会采用高斯消元或其他数值更稳定的算法直接求解。所以最佳实践非常简单除非你明确需要A的逆矩阵作为中间结果否则永远用\解线性方程组。8.3 关于特征值顺序eig返回的特征值顺序并不是固定的。对于同一个矩阵不同版本的 MATLAB或者同一版本中不同的调用方式都可能得到不同顺序的特征值。因此当你需要“最大的特征值”时不要想当然认为D(1,1)就是最大值而应该先提取diag(D)再用max或sort处理。lambda eig(A); max_lambda max(real(lambda)); % 取实部最大的特征值9. 最佳实践与工程建议到这里你已经掌握了 MATLAB 线性代数的基础操作。但在实际项目里使用这些知识时还有一些工程层面的建议值得记住。9.1 解方程优先用左除避免显式求逆前面已经多次提到这一点这里再强调一次。A \ b不仅速度快数值稳定性也更好。不要把数学教材里的写法x A^{-1} b直接翻译成x inv(A) * b在 MATLAB 里它的正确翻译是x A \ b。9.2 判断矩阵病态不要只看det用cond(A)、rank(A)来辅助判断。特别是当你处理的矩阵来自真实数据比如工程测量、图像特征时矩阵往往接近奇异此时条件数比行列式更能反映求解风险。9.3 用向量化代替循环MATLAB 的for循环性能远不如向量化操作。比如对矩阵每一行求和与其写循环不如直接用sum(A, 2)。这不只是语法上的简写而是 MATLAB 底层引擎针对矩阵运算做过多线程和性能优化矩阵运算才是它的强项。% 不推荐用循环累加 s1 0; for k 1:length(v) s1 s1 v(k); end % 推荐直接用 sum s2 sum(v);9.4 养成使用脚本文件的好习惯命令行窗口适合临时验证但如果你想复现一个结果或者把计算过程分享给其他人一定要用.m脚本。脚本里最好加上注释说明矩阵的含义和求解目标。否则一周之后你打开自己写的脚本可能完全想不起来当时的思路。我常用的脚本结构是这样的% 文件路径demo_linear_model.m % 功能求解线性模型系数 % 作者你的名字 % 日期2025-XX-XX clear; clc; % 清空变量和命令窗口 A [2 1; 1 3]; % 系数矩阵 b [5; 6]; % 常数向量 x A \ b; % 求解 disp(x);9.5 分号、注释、变量命名要规范分号和注释直接关系到代码可读性。变量名尽量使用有意义的英文比如不要用a、b、c这种没有语义的命名而是用coeff_matrix、rhs_vector这类名字。这样不仅方便自己阅读也方便别人接手。9.6 不要忽略条件数与残差验证在实际项目中求解完成后一定要验证残差。这一步看起来多余但能在早期发现很多隐蔽错误比如矩阵符号写错、维度不匹配、数据读取顺序错误等。简单一行代码就能完成residual norm(A * x - b);如果residual很大先不急着分析结果回头检查数据。10. 总结与后续学习方向这一篇文章已经把 MATLAB 线性代数的主线走了一遍从矩阵创建和基本运算到用左除求解线性方程组再到特征值与特征向量的计算和验证最后用可视化建立了“矩阵是空间变换”的直觉。每一个例子都可以直接复制运行新手跟着做一遍就能对 MATLAB 的矩阵思维有一个完整的体感。接下来如果你想继续深入有几个方向值得关注矩阵分解LU 分解、QR 分解、奇异值分解SVD。SVD 在数据降维、图像压缩、推荐系统里出现频率极高。数值线性代数了解浮点误差、条件数、病态问题产生的原因这会让你在工程中少踩很多坑。线性代数的应用场景主成分分析、最小二乘拟合、控制系统里的状态空间、图像处理里的仿射变换。这些方向都会用到今天讲的命令。MATLAB 自带工具箱比如统计、优化、控制系统工具箱它们底层都依赖矩阵运算。基础打牢以后再上手工具箱会轻松很多。建议你收藏这篇文章把它当成一份可以随时查的速查手册。等真正开始做数学建模、图像处理或数据分析项目时再回头看这里的示例你会发现自己对线性代数的理解已经不再是“会考试”而是“会用”了。这套“大谦MATLAB线性代数”系列后续还会继续拆解更多专题下一次遇到难题时记得回来看看。
返回列表