ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MATLAB线性代数教程:从矩阵运算到SVD图像压缩实战

MATLAB线性代数教程:从矩阵运算到SVD图像压缩实战 大家好欢迎来到大谦 MATLAB 系列教程。提到线性代数很多人的第一反应是课本上的公式推导、行列式展开和手算矩阵。但当你真正需要用它解决工程问题——比如数据分析、图像压缩、控制系统建模——手算远远不够。MATLAB 本身就是从 MATrix LABoratory矩阵实验室发展而来的它的核心数据结构就是矩阵。换句话说用 MATLAB 学线性代数是连接数学概念和工程落地之间最短的路径之一。这篇文章是大谦 MATLAB 线性代数免费教程的系统性整理。内容从向量、矩阵的创建开始一直讲到线性方程组求解、特征值、LU/QR/SVD 分解最后给出两个综合实战最小二乘拟合和 SVD 图像压缩。每个知识点都配套可运行的 MATLAB 代码和结果解读零基础读者也可以跟着敲一遍。1. 为什么用 MATLAB 学习线性代数1.1 矩阵实验室的由来MATLAB 的名字取自 MATrix LABoratory也就是“矩阵实验室”。它最早是 20 世纪 70 年代基于 Fortran 编写的 LINPACK 和 EISPACK 矩阵计算库封装而来的交互工具。也就是说矩阵运算是 MATLAB 的基因而不是后来添加的功能。在线性代数课堂上我们经常花大量时间做矩阵乘法、求逆、算特征值。这些计算重复度高、容易出错而且一旦矩阵规模变大手算基本不可行。MATLAB 把线性代数中最高频的操作做成了内置函数底层调用经过优化的数值计算库速度和稳定性远好于自己写循环。所以无论你是为了通过考试、做课程设计还是为后续科研和工作打基础用 MATLAB 来验证和计算线性代数问题都是效率很高的选择。1.2 本教程适合哪些读者正在学习《线性代数》课程的本科生想通过编程验证自己的计算结果。准备数学建模竞赛需要快速实现矩阵求解、最小二乘、特征值分析的参赛选手。刚开始接触 MATLAB想从最实用的矩阵操作入门的零基础读者。工程师或科研人员希望用 MATLAB 完成数据拟合、图像处理、控制系统分析中的线性代数任务。1.3 学完你能掌握什么学完本教程你应该能独立完成以下任务创建任意尺寸的向量和矩阵并能灵活索引、修改、变形。区分矩阵乘法与逐元素运算知道什么时候用*什么时候用.*。求解线性方程组Ax b并能判断有解、无解、无穷多解的情况。计算矩阵的特征值、特征向量并解释结果的含义。使用 LU、QR、SVD 分解解决实际工程问题。独立完成最小二乘拟合和基于 SVD 的图像压缩小项目。2. 环境准备与 MATLAB 基础操作2.1 MATLAB 版本与安装说明MATLAB 的版本命名规则是 R 年份加 a/b 后缀例如 R2022a、R2022ba 代表上半年发布b 代表下半年发布。本文所有示例使用的都是 MATLAB 的基础函数不依赖某个版本的独占特性所以从 R2020b 到目前的新版本一般都能直接运行。如果你本机装的是较早版本先看函数是否存在再根据实际情况调整即可。如果没有安装 MATLAB可以在 MathWorks 官网申请学生版或试用版也可以先用 MATLAB Online 在线版快速体验。安装时需要留意安装路径中尽量不要出现中文否则个别工具箱的路径解析可能出问题。具体的安装步骤网上资料很多这里不再展开。2.2 三个常用界面初次打开 MATLAB你会看到几个窗口命令行窗口Command Window适合输入简单命令按回车立即执行适合快速验证想法。编辑器Editor用来编写和保存.m脚本文件适合写多行代码和注释。实时编辑器Live Editor文件后缀是.mlx代码、运行结果、图表混排在一个文档里特别适合做教程和实验报告。本文推荐你在编辑器中新建脚本文件把代码逐段复制进去运行。线性代数的例子往往有多行在命令行里频繁按上下箭头并不方便。2.3 准备第一个脚本在开始之前建议建立一个专门的文件夹保存本教程代码例如D:\matlab_learning\linear_algebra并在 MATLAB 里把当前目录切换到该文件夹。然后新建脚本test_first.m输入下面的内容并运行% 文件路径test_first.m A [1 2; 3 4]; disp(矩阵 A ); disp(A); disp(A 的行列式 ); disp(det(A));运行后命令行窗口会显示矩阵A和它的行列式。这个脚本虽然只有几行但已经体现了 MATLAB 线性代数最核心的流程定义矩阵、调用内置函数、输出结果。后面所有内容都在这个基础上扩展。3. 向量与矩阵的创建和访问3.1 行向量与列向量线性代数中向量分行向量和列向量。MATLAB 里用空格或逗号分隔元素表示行向量用分号分隔元素表示列向量% 行向量 v_row [1 2 3 4]; % 列向量 v_col [1; 2; 3; 4]; disp(v_row); disp(v_col);这里需要注意行向量和列向量在数学上并不等价。例如做矩阵乘法时v_row * v_col得到一个标量内积而v_col * v_row得到一个 4×4 矩阵外积。很多初学者在这里栽跟头后面讲矩阵乘法时会再具体分析。3.2 冒号运算符与等差数列生成等差数列向量是线性代数实验中最常用的操作a 1:5; % 1 2 3 4 5 b 1:2:9; % 1 3 5 7 9 c 10:-2:2; % 10 8 6 4 2 d linspace(0, 1, 5); % 0 0.25 0.5 0.75 1冒号运算符的格式是起点:步长:终点步长为正时递增步长为负时递减步长省略时默认为 1。需要注意这种写法取到的区间是左闭右闭的终点只要不越界就会被包含在结果里。linspace(起点, 终点, 个数)按指定数量生成等间隔点它比冒号写法更适合“我就想取 N 个点”的场景在绘图和拟合中经常用到。两者都能产生等差数列区别只是指定步长还是指定个数你可以按习惯选择。3.3 常见特殊矩阵在实际问题里我们经常需要构造零矩阵、单位矩阵、随机矩阵等Z zeros(3, 4); % 3×4 全零矩阵 O ones(2, 3); % 2×3 全一矩阵 E eye(4); % 4×4 单位矩阵 R rand(3, 3); % 3×3 均匀分布随机矩阵 N randn(2, 4); % 2×4 标准正态分布随机矩阵 D diag([1 2 3]); % 以 [1 2 3] 为对角元素的 3×3 对角矩阵其中eye对应线性代数里的单位矩阵Idiag既可以构造对角矩阵也可以提取矩阵的对角线。rand和randn是随机矩阵常用于构造测试数据。灵活使用这些函数可以省去大量手工输入元素的时间。3.4 矩阵尺寸与索引创建矩阵之后最常用的操作是查询尺寸和提取子矩阵。MATLAB 的下标从 1 开始这一点和 Python、C 语言不同需要特别注意A magic(4); % 生成 4×4 幻方矩阵每一行、每一列和对角线的和相等 size(A) % 返回 [4 4] length(A) % 返回 4等价于 max(size(A)) A(2, 3) % 第 2 行第 3 列的元素 A(2, :) % 第 2 行全部元素 A(:, 3) % 第 3 列全部元素 A(1:2, 2:3) % 第 1~2 行、第 2~3 列组成的子矩阵 A(end, :) % 最后一行索引是 MATLAB 的高频操作。:表示这一维全部取到end表示最后一行的下标。灵活使用这两种写法可以避免硬编码数字导致脚本在矩阵尺寸变化时出错。比如你写A(1:2, 1:2)提取左上角 2×2 子块但如果后来A变成了 5×5这段代码依然能运行可提取的就不是原来想要的位置了。这时用A(1:2, 1:2)配合end或size更稳妥。4. 矩阵的基本运算4.1 加减法与数乘矩阵加减法和数乘与线性代数课本上的定义完全一致两个矩阵维度相同才能相加数乘就是把每个元素都乘以该数。A [1 2; 3 4]; B [5 6; 7 8]; C A B; D A - B; E 3 * A;运行后可以自行观察结果。需要提醒的是如果两个矩阵尺寸不一致MATLAB 会直接报错“矩阵维度必须一致”Matrix dimensions must agree。这个报错在初学阶段非常高频解决办法是先size(A)、size(B)确认尺寸再决定是补零、转置还是重新构造数据不要一看到报错就盲目修改代码。4.2 矩阵乘法与逐元素乘法的区别这是初学者最容易混淆的地方。A * B是线性代数意义上的矩阵乘法要求A的列数等于B的行数。结果矩阵的第(i, j)个元素是A第i行与B第j列对应元素的乘积之和。A .* B叫作逐元素乘法也叫点乘要求A和B尺寸完全一致。结果矩阵的每个元素是A和B对应位置的元素相乘。A [1 2; 3 4]; B [5 6; 7 8]; A * B % 矩阵乘法结果是 [19 22; 43 50] A .* B % 逐元素乘法结果是 [5 12; 21 32]同理除法也有/和./的区别乘方也有^和.^的区别。逐元素运算在向量化编程里非常重要比如对一组数据同时求平方用x .^ 2就能完成完全不用写 for 循环。判断标准很简单你心里想的是“矩阵和矩阵相乘”还是“每个位置单独算”前者用*后者用.*。4.3 转置、逆矩阵与行列式M [1 2 3; 4 5 6]; M % 转置结果是 3×2 矩阵 A [2 1; 1 3]; inv(A) % 求逆矩阵 det(A) % 行列式用于判断矩阵是否可逆 rank(A) % 矩阵的秩 trace(A) % 矩阵的迹对角线元素之和这里有一个重要的工程经验虽然 MATLAB 提供了inv函数用于求逆矩阵但在求解线性方程组时不推荐写成inv(A) * b而是应该使用A \ b。原因是inv会先完整计算逆矩阵计算量更大数值稳定性也更差而反斜杠运算符会根据矩阵结构自动选择合适算法后面第 5 节和第 10 节会详细说明。4.4 内积、范数与正交线性代数中向量的内积、范数和正交概念在 MATLAB 里都有直接对应的函数u [1 2 3]; v [4 5 6]; dot(u, v) % 内积 cross(u, v) % 三维向量叉积 norm(u) % 2-范数即向量长度 norm(u, 1) % 1-范数如果两个非零向量的内积为 0它们就是正交的。这个判断在最小二乘、Gram-Schmidt 正交化和信号处理中都会用到。后面讲 QR 分解时我们会再次看到“正交”概念的工程价值因为正交矩阵的逆就是它的转置这会让很多计算变得又快又稳定。5. 求解线性方程组5.1 方程组与矩阵形式线性方程组是线性代数最直接的应用。比如方程组2x y 5 x 3y 6可以写成矩阵形式Ax b其中A [2 1; 1 3]; b [5; 6];这里A是系数矩阵b是右端向量要求解的未知向量x [x; y]。把日常问题抽象成矩阵形式是工程建模的第一步也是后面所有求解操作的前提。5.2 使用反斜杠运算符求解MATLAB 求解线性方程组的基本方式是反斜杠运算符\它表示“左除”也就是从左往右解矩阵方程A [2 1; 1 3]; b [5; 6]; x A \ b; disp(x);对于上面的方程运行结果为x 1.8000 1.4000也就是说x 1.8y 1.4。你可以带回原方程验证2×1.8 1.4 51.8 3×1.4 6完全正确。反斜杠运算符会根据矩阵A的类型自动选择算法如果是方阵它会做 LU 分解如果是三角矩阵会做回代如果矩阵稀疏会走稀疏求解器。这也是为什么推荐它代替inv因为你在写代码时不需要关心底层的具体方法交给 MATLAB 选择通常是最优的。5.3 无解与无穷多解的情况当系数矩阵A不可逆时方程组可能无解也可能有无穷多解。判断方法之一是比较系数矩阵和增广矩阵的秩A [1 2; 2 4]; % 第二行是第一行的 2 倍 b1 [3; 6]; % 右端向量也成比例无穷多解 b2 [3; 7]; % 右端向量不成比例无解 rank([A, b1]) % 等于 rank(A) 1说明有解且是无穷多解 rank([A, b2]) % 等于 2大于 rank(A) 1说明无解判断规则可以这样记忆如果增广矩阵的秩大于系数矩阵的秩方程组无解如果两者相等且等于未知数个数有唯一解如果两者相等但小于未知数个数有无穷多解。这个结论用rank函数几秒钟就能验证不用每次手算消元。在 MATLAB 中直接对不可逆矩阵用A \ b会得到一个结果并附带警告“矩阵接近奇异值或者缩放错误。结果可能不准确”。这个警告是在提醒你别信这个结果遇到时要回头检查数据
返回列表