资讯详情

MATLAB入门实操:从矩阵运算到脚本绘图调试

📅 2026/10/12 10:41:20 | 华诺云谱 👁 阅读
MATLAB入门实操:从矩阵运算到脚本绘图调试
刚接触MATLAB的时候很多人会把它当成一个计算器加强版来用输几个命令也算出了结果但真到了要独立完成一个入门级演示项目时才发现自己连怎么把代码组织得像样都还没想清楚。这篇文章就是写给那些已经安装好MATLAB、但还没真正上手的读者用一整套能照着敲、能复现结果的入门演示流程把界面、变量、矩阵运算、脚本与函数、绘图、控制流、调试这几块基础内容串起来。我会按照我这些年带新人时最常用的思路来讲先建立起对工作环境的最小认知然后亲手写几段代码在动手过程中理解MATLAB的核心逻辑最后再说清楚后续该往哪个方向扩展。无论是课程作业、科研绘图还是数据分析这套入门演示都能帮你迈过最尴尬的不知道从哪里开始阶段。1. 从第一行代码开始MATLAB的环境认知与最小工作流1.1 界面上那些窗口到底各管什么如果刚打开MATLAB你大概会看到一个由多个面板组成的界面。很多人一上来就盯着这些窗口发呆其实只要记住一个原则就行大多数时候你只跟两个地方打交道——命令窗口和编辑器。命令窗口就是那个带 提示符的窗口你可以在这里直接输入命令、立刻看到结果适合做一些小验证。比如输入 1 2按回车立刻会得到 ans 3。这种输入即反馈的特点让命令窗口非常适合试探性操作。编辑器则是你真正写程序的地方类似写作文的稿纸。在编辑器里写好代码后保存为.m文件再点击运行程序里的所有代码会按顺序执行一遍。我见过不少新手把又长又复杂的代码直接贴在命令窗口里一回车执行一大串中间如果哪行报错了整个屏幕乱成一团改都不知道从哪改起。习惯一定是命令窗口只做小实验正式代码全部放在编辑器里。除此之外界面上还有三个值得认识的窗口工作区Workspace显示当前内存里的所有变量名、大小、类型。写程序时你可以盯着这里确认变量是不是真的被创建了、数据维度是否符合预期。当前文件夹Current Folder相当于文件管理器用来浏览你的.m文件和数据的存放位置。记得把工作目录切到项目文件夹否则经常出现找不到文件的诡异问题。命令行历史Command History记录你在命令窗口敲过什么下次要重新执行类似命令时可以偷个懒。1.2 写第一段能跑起来的代码我们用一个最经典的入门演示来建立最小工作流生成一堆随机数然后画成图。在编辑器里新建一个脚本输入下面三行x randn(1000, 1); histogram(x, 30); title(1000个正态分布随机数的直方图);保存为demo_first.m然后点运行。你会看到一张钟形的直方图弹出来。这短短三行代码其实已经包含了MATLAB入门阶段最核心的三件事randn用来生成服从标准正态分布的随机数出来是一个1000×1的列向量histogram函数负责画直方图第二个参数30表示分30个柱子title给图像加标题注意画完图后要继续修饰用的是函数调用而不是属性面板。跑通了这段代码之后你其实已经有了一个完整的数据 → 计算 → 可视化链路。后面几乎所有项目都是这个链路的放大版。提示保存脚本时不要用中文文件名也不要用纯数字开头比如1demo.m在运行时可能因为名字解析问题报错。用英文字母加下划线最稳妥。1.3 让结果留在工作区分号、变量与输出我让新人做一件事把上面三行代码里的第一行末尾加分号再运行然后观察命令窗口的变化。很多第一次接触MATLAB的人都会忽略分号的作用。x randn(1000, 1); % 带分号执行但不在命令窗口打印结果 x randn(1000, 1) % 不带分号执行并立即打印全部数据如果你的向量有1000个元素不带分号的话命令窗口会被刷屏你的眼睛会被1000个数瞬间淹没。分号在MATLAB里干的活和别的语言不一样它不是结束语句而是执行完这个语句但抑制输出。有没有分号都影响变量赋值本身只影响要不要把结果打印到命令窗口。所以在入门阶段就要养成直觉如果某次计算只是为了产生中间变量后面还要被别的语句使用就在那一行末尾加分号如果你正在调试、想马上确认中间结果对不对就暂时去掉分号。等调试完再加回来。这个习惯会在你跑大脚本的时候救你一命。想象一下一个循环跑1000次迭代如果你在循环体内部不小心漏了分号每次迭代都会把整个中间变量打印一遍性能会慢到怀疑人生。2. 真正理解MATLAB的底层逻辑一切皆矩阵2.1 标量、向量与矩阵的统一表达很多从C语言、Python把列表当数组用转过来的新手会有一个思维惯性变量是变量数组是数组。比如a 5就认为a是一个整数b [1,2,3]就认为b是一个列表。但在MATLAB里这两种东西本质上是同一类对象——都是矩阵array。在MATLAB看来5是一个1×1的矩阵[1, 2, 3]是一个1×3的矩阵也就是行向量[1; 2; 3]是一个3×1的矩阵也就是列向量一个二维表格数据就是一个m×n的矩阵。这种万物皆矩阵的设计让很多运算变得异常统一。你可以对5做转置结果还是5你也可以把一个数加到矩阵所有元素上不需要写循环a 5; M [1 2; 3 4]; M a % 结果 [6 7; 8 9]就是每个元素加5在C语言里你要对数组每个元素加一个数无论如何都得写个循环。但MATLAB把标量也当成矩阵运算规则自动扩展这种广播式行为在入门阶段非常贴心。2.2 从矩阵运算看MATLAB为什么快初学的时候一定有人跟你说过MATLAB矩阵运算快。但这里要分清快到底是什么快。如果你写的是逐元素的循环MATLAB往往并不快甚至比C和Python慢真正快的是把问题转成矩阵运算之后MATLAB内置的底层库对矩阵乘法、分解、傅里叶变换这类操作做了深度优化。这也是MATLAB哲学里的核心一条能不用循环就尽量不用循环直接用矩阵运算表达你的算法。举个例子。求一个向量所有元素的平方和你当然可以写x randn(10000, 1); total 0; for i 1:length(x) total total x(i)^2; end但更MATLAB的方式是x randn(10000, 1); total x * x; % 向量转置后与原向量做矩阵乘法一行搞定。这行代码在数学上等价于计算向量x与自身的内积也就是元素平方和。对于一万个元素这种写法的速度通常是循环的几十倍甚至上百倍。你不需要等到很高级才理解这个理念入门阶段就要把它装进脑子里。2.3 矩阵索引与切片入门必过的关如果只能挑一个知识点作为MATLAB入门的生死线我会选索引和切片。先记住基本规则MATLAB的下标从1开始不是从0开始。这个坑几乎每个从其他语言转过来的新手都会踩不需要我多强调它的破坏力。假设我们有一个向量v [10 20 30 40 50]; v(3) % 得到30 v(2:4) % 得到[20 30 40] v(end) % 得到50end表示最后一个位置 v(end-1) % 得到40对于矩阵索引可以用行,列的方式M [1 2 3; 4 5 6; 7 8 9]; M(2, 3) % 第2行第3列得到6 M(1, :) % 第1行所有列得到[1 2 3] M(:, end) % 所有行最后一列得到[3; 6; 9] M(2:3, 1:2) % 第2到3行、第1到2列的子矩阵[[4 5];[7 8]]冒号:在这里是全部/范围的意思不是字符串冒号。还有一个很容易被忽略的用法用逻辑值索引。比如筛选出向量中大于30的元素v [10 20 30 40 50]; mask v 30; % 得到 [false false false true true] v(mask) % 得到 [40 50]这种逻辑索引在入门后期非常常用它会让你避免写一大堆条件循环。现在先了解这个机制存在后面第5节我们再展开。我把这个索引切片问题说得很细是因为它在实际演示项目里几乎无处不在。你想从一批实验数据里取出温度超过阈值的时间段要用切片你想在Excel表格读进来的数据里挑出某几列要用切片你想把图像矩阵的某一块裁剪出来还是要用切片。3. 脚本与函数从写一次性代码到搭建可复用工具3.1 脚本文件的组织习惯脚本文件Script就是按顺序执行的命令清单。你之前写的所有代码不管是三行还是三百行放进一个.m文件里从头执行到尾这就是一个脚本。但脚本用多了会有一个问题所有变量都会留在工作区里互相干扰。你在script_a.m里定义了一个变量data又写了script_b.m里也用了data第二次运行可能用的还是第一次的旧数据程序不报错但结果就是错的。所以入门阶段第二重要的习惯就是及时把逻辑封装成函数。函数和脚本最大的区别是函数内部的变量默认不污染工作区它只通过输入参数接收数据通过输出参数返回结果。这就像一台榨汁机你把苹果放进去出来的是果汁而苹果皮和果核都留在机器内部没有倒出来。3.2 自己写函数的完整套路一个MATLAB函数的标准结构长这样function output my_demo_func(a, b) % 简单示例函数把两个输入相加后乘2 % 输入a, b 任意数值 % 输出2*(ab) temp a b; output 2 * temp; end保存的文件名必须和函数名一致也就是my_demo_func.m。文件第一行以function开头声明输出变量、函数名和输入参数。函数体内部写的temp就是局部变量函数调用结束后就在工作区里消失了。调用方式result my_demo_func(3, 4); % result 14这里的result是外部变量它接收函数的输出。你可以把my_demo_func想象成一个黑盒子外部只关心进去什么、出来什么不关心里面发生了什么。那function output my_demo_func(a, b)中的output和end是不是必须的输出变量名可以随便起但函数体内部一定要给这个变量赋值end在函数较长时建议写上表示函数结束可读性和健壮性都更好。3.3 输入参数、输出参数与错误保护入门阶段写函数不需要一上来就学很复杂的语法只要掌握几个关键点就够了。第一函数可以有多个输出。用方括号列出来就行function [mean_val, std_val] my_stats(x) mean_val mean(x); std_val std(x); end调用时[m, s] my_stats(randn(100, 1));这种多输出函数在处理数据分析时太常用了比如你要算一组数据的最小值、最大值、平均值与其分别调用三次函数不如一次性返回。第二可以在函数里加错误保护。比如检查输入是否为空function [mean_val] safe_mean(x) if isempty(x) error(输入不能为空向量); end mean_val mean(x); enderror函数会在条件满足时报错并终止函数运行。入门阶段你可能会觉得写这种保护是浪费时间但等你在脚本里用过别人写的没有保护的函数输入了一个空数组导致后面所有结果都变得莫名其妙你就知道这一行error价值多大。第三要养成写注释的习惯。函数开头那几行以%开头的注释在MATLAB里不只是给人看的它也是help命令会显示的文档。写完函数在命令窗口输入help my_demo_func就能看到你写的函数说明。这个习惯对你的同学、同事以及未来三个月后的自己来说都是十足的善意。4. 让数据说话入门级绘图实操4.1 最常用的plot及其变形绘图是MATLAB入门级演示里最容易让人获得成就感的部分但也是细节最多的地方。很多人画出来的图能用但不好看问题往往不在数据而在几个基础函数的参数用得不够熟。最基础的plot用法x linspace(0, 2*pi, 100); y sin(x); plot(x, y, LineWidth, 1.5);这里linspace(0, 2*pi, 100)表示把0到2π区间均匀生成100个点。最后一个参数LineWidth, 1.5是名称-值对的写法用来设置线宽是MATLAB绘图里非常常见的一种传参模式。如果你想让两条曲线在一张图里对比最简单的办法是连续调用两次plot再加hold on和hold offx linspace(0, 2*pi, 100); plot(x, sin(x), r-, LineWidth, 1.5); hold on; plot(x, cos(x), b--, LineWidth, 1.5); hold off; legend({sin(x), cos(x)});r-表示红色实线b--表示蓝色虚线。这样画出来的图一下子就有对比感了。legend用来加图例里面的两个标签要和画线的顺序对应。4.2 子图与多图一张画布讲清楚对比有时候你想把好几个相关的图画在同一张画布里分别上下排列subplot就是干这个的。常见写法x linspace(0, 2*pi, 100); y1 sin(x); y2 cos(x); subplot(2, 1, 1); plot(x, y1, LineWidth, 1.5); title(sin(x)); subplot(2, 1, 2); plot(x, y2, LineWidth, 1.5); title(cos(x));subplot(m, n, p)的意思是把画布划分为 m 行 n 列的小格子当前激活第 p 个格子。上面的代码把画布分成两行一列第一幅画在上格第二幅画在下格。我建议初学者在做入门演示时哪怕只有一个图也养成用figure创建新图形的习惯。如果你连续画好几个不同主题的图但没加figure新图会直接覆盖旧图你最后只看到最后一张。正确的做法是figure; plot(...); figure; plot(...);每次画新图前先开一个新的figure窗口各图互不干扰。4.3 导出图片时容易忽略的三件事入门演示做完之后大概率要出图交作业或者发报告这时导出图片的质量就很重要。我见过很多新手直接在figure窗口里点保存保存出来的图分辨率很低放到文档里字都看不清。导出图片建议用命令而不是鼠标点按钮print(gcf, -dpng, -r300, my_figure.png);gcf表示当前图形窗口-dpng指定输出PNG格式-r300表示分辨率300 DPI足够印刷和打印了。如果嫌PNG太大也可以输出成矢量图print(gcf, -depsc, my_figure.eps);矢量图在报告里缩小放大都不会失真。还要注意坐标轴范围。很多人画完图后坐标轴会自动适应数据范围但有时候你希望固定范围以便对比多个图可以用xlim([0, 6]); ylim([-1.2, 1.2]);最后是一个看起来很小但很实际的问题图例和标题的字体大小。MATLAB默认字号在屏幕上看着还行放到论文或PPT里往往会偏小。可以在绘图时顺带统一设置set(gca, FontSize, 12);这行代码把当前坐标轴所有文字的字体都设为12磅比一个个改省事得多。提醒画图之前先想想这张图给谁看、放在什么介质里。屏幕上看、PPT投影、打印出来这三种场景对字体大小和线宽的要求差别很大。入门阶段养成导出前看一眼300 DPI规格的习惯能帮你避免很多后期返工。5. 控制流与向量化思维写MATLAB代码的两种境界5.1 条件判断与循环的入门写法虽然MATLAB的强项是矩阵运算但控制流依然是不可避免的基础。入门至少要掌握if-elseif-else和for循环的写法。条件判断score 75; if score 90 grade A; elseif score 80 grade B; elseif score 70 grade C; else grade D; end注意MATLAB的条件判断用if、elseif、else、end包裹其中elseif是一个词中间不用空格不像Python里是elif。for循环n 10; s 0; for i 1:n s s i^2; end这段代码计算1^2 2^2 ... 10^2。i 1:n表示从1到n依次取值步长为1。如果步长不是1可以写成i 1:2:n表示从1开始每次加2到不超过n为止。还有while循环适合不知道循环次数的情况x 1; while x 100 x x * 2; end这里x最后是128。while循环要特别注意避免死循环——条件永远为真程序就停不下来了。入门阶段最简单的预防办法是在进入循环前打印/检查一下循环变量的变化规律。5.2 为什么要学习向量化前面已经提过MATLAB里尽量用矩阵运算代替循环这里展开说说为什么这不仅仅是性能问题也是代码可读性问题。假设你要计算这样一个函数对向量t的每个元素如果该元素大于0结果等于它的平方否则等于它的相反数。用循环写的版本t -5:0.1:5; n length(t); y zeros(1, n); for i 1:n if t(i) 0 y(i) t(i)^2; else y(i) -t(i); end end用向量化写法t -5:0.1:5; y zeros(size(t)); mask t 0; y(mask) t(mask).^2; y(~mask) -t(~mask);后面这个版本没有循环也没有if但代码依然很直观先生成一个逻辑掩码mask表示t里哪些元素大于0然后分别对 0 和 ≤0 的两批元素赋值。~mask是逻辑非表示不大于0的位置。这两段代码的结果完全一样。循环版本容易理解向量化版本在执行效率上通常高出一个数量级而且在MATLAB里更符合数据整体操作的思维方式。5.3 用逻辑索引取代循环的实战例子来看一个更贴近实际演示的例子有一组实验测量值data其中有些是异常值比如突然的尖峰我们希望把所有超过阈值thresh的数值替换为中位数。用循环的写法data [1.2 2.5 99 2.1 1.8 3.0 200 2.2]; thresh 10; med median(data); for i 1:length(data) if data(i) thresh data(i) med; end end用逻辑索引的写法data [1.2 2.5 99 2.1 1.8 3.0 200 2.2]; thresh 10; med median(data); data(data thresh) med;就一行data(data thresh)先取出所有超过阈值的元素然后把它们赋值为中位数。这行代码翻译成人话就是把data里超过thresh的元素全部换成med。你在入门级演示里不需要刻意追求完全不用循环但至少要知道凡是对每个元素做同样判断、再赋值的操作大概率都能用逻辑索引改写。能用逻辑索引写的代码不仅短还不容易因为下标越界出错。等到后面你接触到匿名函数、arrayfun、cellfun、accumarray这些更高级的工具时会发现向量化思想贯穿始终。入门阶段先把逻辑索引这个武器掌握熟练就好。6. 入门阶段最值得掌握的调试与排错手段6.1 读懂报错信息的三层含义MATLAB的报错信息刚接触时很劝退一张红字大屏夹着Error using ...和Error in ...。其实它是有固定结构的真正有用的信息藏在三层里。第一层是哪一行出错。报错信息最后通常会有类似Error in demo_first (line 3) histogram(x, 30);这告诉你错误发生在demo_first.m的第3行。第二层是调用了哪个函数出错。比如Error using histogram表示问题出现在调用histogram函数的时候。第三层才是具体什么错。常见的有Undefined function or variable x变量x不存在很可能之前代码被注释掉或者名称拼错了。Index exceeds the number of array elements下标越界比如向量只有5个元素你去取第6个。Matrix dimensions must agree矩阵维度不匹配比如一个3×1的向量和一个1×3的向量做逐元素乘法。排错口诀先看最下面的具体错误再看哪一行最后从后往前读整个报错栈。很多人一看到红字就慌然后从第一行开始读其实顺序反了很容易迷失在大量内部函数调用信息里。6.2 断点调试与逐步执行如果代码规模超过20行入门阶段就必须学会使用编辑器里的断点功能。用过其他IDE的人应该不陌生MATLAB也是类似的机制。在编辑器左侧的行号边上点击一下会看到一个红点这就是断点。点运行程序执行到断点那一行之前会停下来然后你可以用以下几个按钮控制执行流程继续Continue让程序继续运行到下一个断点或结束步入Step In执行当前行如果当前行是函数调用会进入到函数内部逐行执行步过Step Over执行当前行如果当前行是函数调用把它当成一个整体执行完再跳到下一行步出Step Out如果当前已经进入了一个函数直接执行完当前函数并返回调用点。调试中你还可以随时查看工作区里的变量值也能把鼠标悬停在代码里的变量名上看它的当前值。刚开始用断点的时候很多人的误区是断点越多越好。其实断点越少越好你只需要在程序最可疑的地方设置一个断点然后让程序跑起来看执行到那里时变量是否符合预期。如果符合说明之前的代码没问题问题在之后如果不符合说明问题在到达断点之前。6.3 常见错误类型与应对清单根据我带新人的经验入门级演示项目里90%的报错跑不出下面这张表报错信息特征常见原因快速排查思路Undefined function or variable xxx变量名拼写不一致或者函数尚未定义检查工作区是否存在该变量检查函数文件名是否与函数名一致Index exceeds array bounds下标越界或索引取了0检查向量/矩阵的 size确认是否把下标从1开始忘了Matrix dimensions must agree进行运算的两个矩阵维度不一致用 size 查看两个矩阵维度检查是否漏了转置Error using plot/Error using histogram输入参数类型不对或变量为空检查绘图数据是否为数值型、是否为空向量Attempt to execute SCRIPT as a function调用了与脚本同名的函数不要把脚本命名为你打算作为函数调用的名字Unbalanced or unexpected parenthesis括号不匹配在编辑器中启用括号高亮逐层检查这列表不用死记重点是养成两个习惯报错后第一时间看行号和最后一行出错前用size、whos检查变量状态。whos是我很推荐入门阶段使用的命令它比size信息更全会列出所有变量的名称、大小、字节数和类型。当你觉得程序怎么像个黑箱时在命令窗口敲一句whos立刻能看清全局。另外有个特别常见的坑同一文件夹下既有demo_first.m又有demo_first.mlx之类同名文件MATLAB调用时可能分不清你要的是哪一个。入门阶段老老实实用.m后缀就好别同时创建名字一样的不同类型文件。7. MATLAB工具箱生态与后续进阶方向7.1 工具箱不是越多越好用MATLAB一段时间后你一定会注意到安装界面里那些琳琅满目的工具箱Toolbox。什么信号处理工具箱、统计工具箱、图像处理工具箱、深度学习工具箱、Simulink等名字一个比一个唬人。但我想说句实在话入门阶段根本用不到90%的工具箱甚至刻意去安装它们只会增加启动负担和学习焦虑。MATLAB安装界面里的工具箱本质上是一堆按需加载的专业函数包。你不需要它们的时候它们躺在那里既不干扰你也不会让你变厉害。真正需要判断的是你当前这个项目到底涉及哪个领域。比如你做传感器数据分析可能用到统计和机器学习工具箱你做图像处理演示那么图像处理工具箱就成了刚需如果你以后要搭控制系统模型Simulink才是主战场。每个工具箱都有自己的文档和示例入门的时候按项目需求去找比按兴趣列表挨个学效率高得多。7.2 从入门到进阶的推荐路径如果你的目标是能独立完成各种入门级演示我建议按下面这个顺序循序渐进基础操作层本文覆盖的内容界面、变量、矩阵操作、脚本、函数、基本绘图、控制流、调试。达到给我一组数据我能把它读进来、处理、画图、导出一张结果图的水平。数据导入层学会用readtable、readmatrix、xlsread等函数读取Excel、CSV、文本文件学会用save/load保存和读取.mat文件。数据可视化扩展层学scatter、bar、boxplot、heatmap、imagesc等不同图形学会用subplot排多图学会自定义颜色、线型、标签。面向应用层根据自己领域选择工具箱。做信号的学fft、filter做图像的学imread、imshow、imfilter做统计的学fitlm、ttest。这个阶段最好的学习材料是官方工具箱文档里的示例直接搜索即可。性能进阶层学会分析代码性能profile、tic/toc掌握向量化、匿名函数、结构体、cell数组逐步接触局部函数和嵌套函数。我觉得很多初学者卡在第1层和第2层之间原因不是不努力而是总想着学完所有功能再开始做项目。实际上MATLAB是一个用到哪学到哪的工具你带着一个小演示目标去学今天不会画误差棒就现查误差棒明天不会读Excel就现查读取函数三个月后你的技能树自然就长起来了。7.3 遇到问题时的高效检索方式最后聊一下自学MATLAB时最值得建立的信息检索习惯。很多人一遇到问题就发论坛提问但提问前其实有几个更快的渠道应该先试一遍。第一是官方文档。在命令窗口输入doc 函数名比如doc plot会打开该函数的完整说明页包括语法、说明、输入输出参数和大量示例。我更推荐的入口是doc前先按F1键光标所在位置的函数说明会立刻弹出。这一步对入门效率提升极其明显。第二是示例中心。MATLAB主界面里有一个实用程序和帮助入口其中有大量现成示例。你不需要从头到尾通读找到和你项目最接近的那个示例把文件下载下来运行再对照着改是最高效的模仿式学习。第三才是社区提问。提问的时候把以下三样东西带齐完整报错信息、最小可复现代码、你期望的输出和实际输出。用我 运行 某函数 出现 错误的方式描述而不是代码报错帮我看看。这样别人能快速定位问题你得到的回复质量也会高得多。我的个人体会是MATLAB入门级演示的目标不必定得多高端能独立完成数据读入 → 简单运算 → 画出一张清晰图表这个闭环你就已经跑赢了绝大多数停留在界面围观阶段的人。剩下的路就是拿一个个小项目不停地磨在磨的过程中把文档当字典、把示例当教材慢慢从会用变成会用得讲究。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑