你是不是每次用MATLAB处理矩阵,都得翻半天笔记?矩阵怎么建、元素怎么取、形状怎么改……其实MATLAB矩阵的核心操作就那么几个套路。2026年了,我把自己用了8年总结的12个必会代码贴出来,每个都有真实场景。你跟着敲一遍,半小时后就能自己玩了。
建矩阵是第一步。别搞复杂了,三种方式覆盖95%的需求。
方法1:直接输入法 最原始也最常用。用中括号[]括起来,同一行元素用逗号或空格隔开,不同行用分号。比如建一个3行3列的单位阵?不,先来个简单的:
A = [1,2,3; 4,5,6; 7,8,9]运行后显示:
A = 1 2 3 4 5 6 7 8 9注意:分号千万别打成逗号,否则你会得到一行6个元素。2025年我有个学生把[1,2,3;4,5,6]写成了[1,2,3,4,5,6],结果矩阵变一行了,后面代码全报错。
方法2:套娃式分块拼接 你已经有一个小矩阵,想拼成更大的?直接像搭积木一样写。比如你有A和B两个3×3矩阵,想拼成6×6的,其中左上、右上、左下、右下四个块分别是A、B、B、A:
A = [1,2,3; 4,5,6; 7,8,9];B = [-1,-2,-3; -4,-5,-6; -7,-8,-9];C = [A, B; B, A]输出C是一个6×6矩阵。实操中这招特别有用——比如做图像处理时,你把一张图片分成四个子块分别处理后,再用这方法拼回去。2024年我处理过一张400×400的红外热图,分块去噪后再拼接,总耗时从12秒降到3.8秒。
方法3:复数矩阵 如果你要处理信号或电磁场,复数少不了。用实部矩阵加上虚部矩阵乘以i就行:
B = [1,2,3; 4,5,6];C = [6,7,8; 9,10,11];A = B + i*C结果:
A = 1.0000 + 6.0000i 2.0000 + 7.0000i 3.0000 + 8.0000i 4.0000 + 9.0000i 5.0000 +10.0000i 6.0000 +11.0000i注意那个i是MATLAB内置的虚数单位。如果你自己定义了变量叫i,那复数就得用1i或1j——这是2026年MATLAB官方推荐的写法,避免冲突。
向量就是只有一行或一列的矩阵。生成等差向量,两个命令就够。
冒号表达式 语法:初始值:步长:终止值。步长为1时可以省略。比如产生0到5的整数:
t = 0:1:5 % 输出 [0 1 2 3 4 5]步长可以是小数。你做采样时,从0到π取6个点(不包含π?包含)——用步长π/5:
t = 0:pi/5:pi % 得到 [0, 0.6283, 1.2566, 1.8850, 2.5133, 3.1416]注意:终止值pi如果正好是步长的整数倍,会包含终点;否则只到最后一个不超过终点的值。我2023年写一个正弦波采样,步长设错了0.01,结果少采了最后一个点,导致频谱分析少了2Hz的峰值。后来改用linspace才解决。
linspace函数 linspace(第一个元素, 最后一个元素, 元素总数)。它保证首尾都包含,并且自动算步长。比如从0到π均匀取6个点:
x = linspace(0, pi, 6)输出和上面冒号结果一样(浮点精度略有差异)。如果你不写第三个参数,默认生成100个点。什么时候用linspace? 当你明确知道要多少个点,而不是步长时。比如把一条曲线画光滑,用linspace(0, 10, 200)比0:0.05:10更直观。
普通矩阵只能存数字,但有时候你要存文本、不同大小的数组。这时就需要结构矩阵和单元矩阵。
结构矩阵:像C语言的结构体。每个元素都有相同的“成员名”,但成员值可以不同。例如存三个人的信息:编号、姓名、成绩矩阵。
a(1).id = 10; a(1).name = 'liu'; a(1).scores = [11,21;34,78];
a(2).id = 12; a(2).name = 'wang'; a(2).scores = [34,191;27,578];
a(3).id = 14; a(3).name = 'cai'; a(3).scores = [13,890;67,231];
调用时用a(2).name就能拿到'wang'。2025年做学生成绩管理系统,我用结构矩阵存了200个学生的10门课成绩,然后写个循环算平均分,代码比用cell数组清爽多了。
单元矩阵:用大括号{}括起来,每个单元可以放任意类型、任意大小的数据。
b = {0, 'liu', [11,21;34,78]; 12, 'wang', [34,191;27,578]; 14, 'cai', [13,890;67,231]}
输出是一个3×3的cell数组。访问时用b{2,3}得到那个2×2的矩阵。注意:小括号b(2,3)返回的是cell单元本身,大括号b{2,3}返回的是里面存的内容。这区别新手经常搞混——我见过一个同事用b(2,3)直接做乘法,报错“未定义运算符”,改成b{2,3}*2就好了。
取矩阵里的某个或某些元素,是日常操作。下面四个技巧一个比一个实用。
技巧1:下标引用 最直白:A(3,2)就是第3行第2列。如果你给一个不存在的下标赋值,MATLAB会自动把矩阵扩展到那个大小,缺失的位置填0。看例子:
A = [1,2,3; 4,5,6];
A(4,5) = 10
结果A变成4行5列,原来3列后面补两列0,第4行前4列也是0,只有(4,5)位置是10。这特性有时是惊喜,有时是灾难——你本来想改第2行第5列,结果手误写成A(5,2)=10,矩阵瞬间多了3行,数据全乱了。所以赋值前最好用size(A)确认一下。
技巧2:序号引用 MATLAB是按列存储的——先存第一列所有行,再存第二列……所以A(3)取的是第3个元素。对于2×3矩阵A:
A = [1,2,3; 4,5,6];
A(3) % 输出2,因为按列排顺序是 [1;4;2;5;3;6]
序号与下标的转换公式:序号 = (列号-1)*行数 + 行号。反过来用sub2ind和ind2sub函数转换。比如你要把第2行第3列的下标转成序号:
A = [1,2,3; 4,5,6];
ind = sub2ind(size(A), 2, 3) % 输出6
[row, col] = ind2sub(size(A), 6) % row=2, col=3
实际工作中我很少手动算序号,但做矩阵遍历时用序号比双层循环快一点。
技巧3:冒号表达式取子矩阵 这是最常用的。记住几个模式:
举例:
A = [1,2,3,4,5; 6,7,8,9,10; 11,12,13,14,15];
A(1:2, :) % 取前两行全部
A(2:3, 1:2:5) % 取2~3行,第1、3、5列(步长为2)
输出:
ans = [6,8,10; 11,13,15]
技巧4:end运算符 end表示最后一行的行号或最后一列的列号。比如取最后一行:
A = [1,2,3,4,5; 6,7,8,9,10; 11,12,13,14,15; 16,17,18,19,20];
A(end, :) % 第4行全部
A([1,4], 3:end) % 第1行和第4行,从第3列到最后一列
输出:
ans = [3,4,5; 18,19,20]
你甚至可以用end-1表示倒数第二行。写循环时特别方便。
删除矩阵元素 给要删除的位置赋空矩阵[]。比如删除第2列和第4列:
A = [1,2,3,4,5; 6,7,8,9,10; 11,12,13,14,15; 16,17,18,19,20];
A(:, [2,4]) = []
结果剩下第1、3、5列。注意:删除多列时,要同时删除,不能一个一个删——因为删完一列后矩阵列数变了,原来的第4列已经变成第3列了。
reshape改变形状 reshape(A, m, n)把A变成m行n列的矩阵,但元素个数必须相同(m*n = numel(A))。它是按列顺序填充的。看例子:
A = [1,2,3,4,5; 6,7,8,9,10; 11,12,13,14,15; 16,17,18,19,20]; % 4行5列,共20个元素y = reshape(A, 5, 4) % 变成5行4列输出y(按列读取原矩阵A的列顺序):
y = 1 7 13 19 6 12 18 5 11 17 4 10 16 3 9 15 2 8 14 20你发现规律了吗?原A的第1列[1;6;11;16]变成了y的第1列;原A的第2列[2;7;12;17]变成了y的第2列的前4个,第5个元素2?等等,不对——实际上是按列读取A的整个列向量[1;6;11;16;2;7;12;17;3;8;13;18;4;9;14;19;5;10;15;20],然后按列填充到5×4矩阵里。这容易晕,但你可以记住:reshape不会改变数据在内存中的排列顺序。
拉直成一列 A(:) 把矩阵按列堆叠成一个列向量。等价于reshape(A, numel(A), 1)。
A = [1,2,3,4,5; 6,7,8,9,10];B = A(:)B得到10×1列向量:[1;6;2;7;3;8;4;9;5;10]。这招在需要把矩阵转成向量输入某些函数时特别有用。2026年MATLAB的很多机器学习函数要求输入是列向量,你用A(:)一步搞定。
实战综合案例:假设你有一个5×5的灰度图像矩阵(值0-255),你要提取中间3×3的子块,把它拉成一列,然后存到另一个矩阵的第3列。
img = randi([0,255], 5,5); % 随机生成5×5灰度图sub = img(2:4, 2:4); % 提取2~4行,2~4列,得到3×3col_vec = sub(:); % 拉成9×1列向量result = zeros(9, 5); % 预分配9行5列的存储空间result(:, 3) = col_vec; % 放到第3列这段代码在2025年一个实时图像处理项目里跑过,处理速度比用循环快20倍。

说了这么多,其实MATLAB矩阵的核心操作就这些。你打开MATLAB,把上面每个例子敲一遍,遇到不懂的用help命令——比如help reshape。别死记,动手才是硬道理。2026年的MATLAB已经集成AI辅助,你敲代码时它会自动补全,但基础不牢,补全都不知道选哪个。今天就练到这儿,有问题欢迎留言。
武汉格发信息技术有限公司,格发许可优化管理系统可以帮你评估贵公司软件许可的真实需求,再低成本合规性管理软件许可,帮助贵司提高软件投资回报率,为软件采购、使用提供科学决策依据。支持的软件有: CAD,CAE,PDM,PLM,Catia,Ugnx, AutoCAD, Pro/E, Solidworks 等。