MATLAB矩阵操作全攻略:从创建、索引到运算与避坑

发布时间:2026/10/2 14:55:19
MATLAB矩阵操作全攻略:从创建、索引到运算与避坑 学MATLAB绕不开矩阵就像学中文绕不开汉字。前几天整理自己的学习笔记发现大部分基础内容其实都和矩阵有关。这篇笔记主要是记录我入门MATLAB时最常碰到的矩阵操作怎么创建、怎么索引、怎么运算以及一堆当时踩过的坑。如果你是刚开始接触MATLAB或者想系统回顾矩阵这部分的基础知识这份笔记应该能帮上忙。1. 为什么MATLAB里一切皆矩阵1.1 矩阵不是普通的“二维表”MATLAB的全称是Matrix Laboratory翻译过来就是“矩阵实验室”所以矩阵这个概念几乎刻在它骨子里。刚开始学习时我总习惯把矩阵理解成Excel表格后来才发现这个类比很危险。矩阵在MATLAB里不仅仅是一个表格而是一个有严格维度定义的数据对象。更关键的是MATLAB里的标量、向量、矩阵、多维数组全都统一在“数组”这个框架下一个数可以看成1×1矩阵一个行向量是1×n矩阵一个列向量是n×1矩阵二维矩阵自然就是m×n再往上还可以有页、可以有更高维度。这个设计带来的直接好处是你不需要像C语言那样区分数组、指针、结构体几乎所有数据都可以用矩阵来表达。比如你读一张图片它其实是一个三维矩阵长宽是图片尺寸第三维是RGB通道你录一段声音它往往是一个很长的列向量一个表格数据导入后也常常变成一个二维矩阵。理解这一点后你再看MATLAB的很多操作就顺了因为大部分内置函数都在和矩阵打交道。1.2 矩阵的维度、行数、列数和元素总数在入门阶段有三个函数很容易混淆size、length和numel。size(A)返回的是A每个维度的大小比如一个3行4列的矩阵size(A)返回[3 4]numel(A)返回矩阵里总的元素个数也就是行数乘列数3×4的矩阵返回12length(A)则有点坑它返回的是最大维度的值对于3×4矩阵length返回4如果这个矩阵恰好是100×2length居然返回100。我当时就犯过一个大意要用一个矩阵的行数结果用length(A)去拿遇到列数比行数多的情况行数拿错后续整个循环全乱套。后来我给自己定了规矩——要行数就用size(A,1)要列数就用size(A,2)要总数就用numel(A)尽量不要用length只有在明确知道矩阵是向量时才用它。这个习惯看起来小但能少踩很多坑。把矩阵想象成一栋房子行是楼层列是房间号。只知道“最长的那一排”并不能让你知道房子到底有几层。size才是那个告诉你完整结构的尺子。2. 矩阵创建手动输入与快捷函数2.1 方括号、空格、逗号和分号的使用规则创建矩阵最直接的方式就是使用方括号。行元素之间用空格或逗号分隔行与行之间用分号分隔。例如A [1 2 3; 4 5 6; 7 8 9]这个命令生成一个3×3矩阵。如果你想创建行向量可以写作v [1 2 3]创建列向量可以写作v [1; 2; 3]或者写成v [1 2 3].。我特别喜欢用分号创建因为一眼能看出矩阵形状。这里有一个细节如果你在命令行运行命令时结尾没有加分号MATLAB会立刻把结果打印在屏幕上。这在学习时很有用但如果你用脚本跑一个很大的矩阵忘记加分号会把整个命令窗口刷爆运行速度也会变慢。我的习惯是所有创建矩阵的语句后面都加分号需要查看时单独运行变量名。2.2 冒号表达式与linspace生成等差向量MATLAB里最灵活的向量生成工具是冒号表达式基本格式是start:step:end。比如1:2:9生成[1 3 5 7 9]10:-2:2生成[10 8 6 4 2]如果中间不写步长默认步长为1比如1:5生成[1 2 3 4 5]。这里有个容易忽略的地方如果start大于end而步长又是正数得到的是空矩阵。我见过不少初学者写5:2:1结果得到一个空数组然后在后面索引时直接报错。如果你需要生成一个固定数量的向量而不是靠步长计算可以用linspace。linspace(0,1,5)生成从0到1之间均匀分布的5个点0 0.25 0.5 0.75 1。这个方法特别适合画图时构造横坐标比冒号表达式更不容易出错。还有一个类似的logspace用于生成对数等分的向量比如做频响分析时常用。我建议初学者优先掌握linspace因为它不依赖步长的精度计算数量由你直接指定思路更直观。2.3 zeros、ones、eye与随机矩阵预分配和初始化创建特殊矩阵的函数非常多但最核心的四个是zeros、ones、eye和rand。zeros(m,n)生成m×n全零矩阵ones(m,n)生成全一矩阵eye(n)生成n×n单位矩阵即对角线为1、其余为0rand(m,n)生成0到1之间均匀分布的随机数矩阵randn(m,n)生成服从标准正态分布的随机数矩阵。为什么要单独提zeros因为它在编程中经常用来“预分配”。如果你要写一个循环把结果逐个存进矩阵最忌讳的做法是每次循环让矩阵自动增长比如A(end1) x这样每增加一个元素MATLAB都要重新分配内存循环次数一多运行时间会成倍增加。正确做法是先把矩阵尺寸定好用zeros初始化然后循环里直接赋值。比如要存100个计算结果就预先写result zeros(100,1)这是MATLAB性能优化的基本功。2.4 矩阵拼接和重复cat、repmat与repelem创建矩阵之后经常需要把两个矩阵拼在一起。横向拼接可以用[A B]纵向拼接用[A; B]但更规范的写法是用cat函数C cat(1, A, B); % 按行方向拼接 D cat(2, A, B); % 按列方向拼接cat(1,...)相当于vertcatcat(2,...)相当于horzcat。对于三维数据还可以用cat(3,A,B)在第三维上拼接这在处理多通道图像时很常见。有时候需要把一个小矩阵重复成大矩阵这时候用repmat和repelem。repmat(A, 2, 3)把A在行方向重复2次、列方向重复3次相当于整体复制。repelem(A, 2, 3)则是将每个元素各重复2次和3次。举个例子A [1 2; 3 4]; repmat(A, 1, 2) % 结果[1 2 1 2; 3 4 3 4] repelem(A, 1, 2) % 结果[1 1 2 2; 3 3 4 4]两者用途完全不同。需要把一组数据平铺到更大区域时我会用repelem需要把整个模式复制多份时用repmat。3. 矩阵索引访问元素与子区域3.1 下标索引与线性索引两个角度访问同一个数访问矩阵元素有两种方式下标索引和线性索引。下标索引就是指定行和列比如A(2,3)表示第2行第3列的元素。线性索引则只用一个数字表示按“列优先”的顺序数过去。所谓列优先就是先数完第一列再数第二列依次往后。例如A [10 20 30; 40 50 60]; A(3) % 结果是20因为存储顺序是10, 40, 20, 50, 30, 60很多初学者在这里卡住觉得A(3)应该是第三个数也就是“第一行第三列”的30但实际是20。原因就是MATLAB在内存中把矩阵按列来排列。如果想从行列下标得到线性索引可以用sub2ind反向用ind2sublinearIndex sub2ind(size(A), 2, 3); % 求第2行第3列的线性索引 [row, col] ind2sub(size(A), 5); % 线性索引5对应的行列有人说用下标不就行了吗为什么还要理解线性索引因为很多内置函数返回的位置是线性索引比如后面要说的find如果不理解列优先拿到索引值后根本对应不上元素。3.2 冒号用法与end关键字提取行、列和子块提取矩阵的某一行、某一列几乎离不开冒号。A(:,1)提取第一列A(1,:)提取第一行A(1:2,2:3)提取左上角2×2子块。这里的冒号表示“所有”。end是一个Magic Word它表示“最后一个索引位置”。比如A(end,:)取最后一行A(end-1, end)取倒数第二行最后一列。end在循环和动态编程里特别有用。我记得自己最早写代码时要往矩阵末尾追加一行总是先数矩阵有多少行再赋值。后来发现直接写A(end1,:) newRow就行这个操作会在原矩阵下方新增一行。这种写法不仅简洁还避免了手动维护行数出错。3.3 逻辑索引用条件直接筛选元素逻辑索引是我觉得MATLAB最优雅的地方之一。你可以用一个真/假矩阵作为索引只有对应位置为true的元素才会被选中。例如A [1 5 3; 2 8 4]; logicalIndex A 4; result A(logicalIndex);result会返回一个列向量里面是所有满足大于4的元素。这等价于两步合并成一步A(A4)。这个写法在处理数据清洗时极好用比如把矩阵里所有负数清零直接写A(A0)0。需要注意逻辑索引的矩阵维度必须和原矩阵相同或者维度可以被隐式扩展。逻辑索引的选择结果永远是列向量形式因为MATLAB会把选出来的元素按线性顺序依次排列。如果你希望保留行列位置可以先转成下标也就是用find。3.4 修改矩阵赋值、删除与扩展索引不但可以读还可以写。A(2,2)100修改单个元素A(:,2)[10;20;30]整列替换A(2,:)[]删除第2行注意这里用空方括号[]作为赋值内容时MATLAB会直接删掉相应行同时矩阵行数减一。删除操作在循环里要格外小心。如果你在for i1:size(A,1)循环中删除某一行循环次数不会动态变化那么跳过某些行或者索引越界几乎是必然的。我的经验是如果要做逐行筛选删除最好先通过逻辑索引一次性选出要保留的行或者倒着循环。比如从后往前删for i size(A,1):-1:1这样索引不会乱。4. 矩阵运算数组运算与线性代数运算4.1 最关键的区分A*B与A.*B矩阵运算中最容易混淆的就是乘号。A * B是线性代数中的矩阵乘法要求A的列数等于B的行数结果第(i,j)个元素是A第i行与B第j列的点积。A .* B是对应元素相乘要求A和B维度完全一致结果矩阵的每个元素是A(i,j)*B(i,j)。我见过太多新手用*去做对应元素相乘结果要么维度不匹配报错要么得到完全错误的结果。记住一个口诀带点的运算是在说“按位置算”不带点的乘除法是线性代数里的矩阵运算。这个区分同样适用于除法和幂次A./B是逐元素相除A/B是右除A.^2是每个元素求平方A^2是矩阵自乘。从物理意义上想.*更像是对照片每个像素做亮度调整*则更像坐标系变换两者服务于完全不同的场景。4.2 转置与共轭转置一个撇关系的两个世界在MATLAB里单引号是共轭转置点号加单引号.才是普通的非共轭转置。当矩阵是实数时两者结果一样一旦涉及复数结果就完全不同了。例如Z [12i, 3-4i]; Z % 得到 [1-2i; 34i] Z. % 得到 [12i; 3-4i]如果你在做傅里叶变换、滤波器设计这类复数运算忘记加地方实会用错。建议在没有复数参与的时候也统一使用.这样代码更安全读代码的人也不会误解你的意图。这是一个非常小但很专业的习惯。4.3 左除和右除解线性方程组的最佳姿势很多人初学MATLAB时会找逆矩阵inv(A)来解线性方程Axb书上有时也这么写。但实际做数值计算时更好用的是左除运算符\x A \ b;它的意思是求解线性方程组A*x b。MATLAB内部会根据A的特点自动选择高斯消去、LU分解、Cholesky分解等方法比直接用inv(A)*b更快、更稳定。右除/则对应x*A b形如的方程比如x b / A。你可能会问为什么不推荐inv因为求逆本身计算量更大而且当矩阵接近奇异时数值误差会被放大。用\相当于让MATLAB悄悄选一条更安全的路径。我平时几乎不写inv除非是要在公式里显式写出逆矩阵。4.4 常用函数速查从行列式到特征值矩阵基础必须掌握的函数大概有这么几类线性代数类det行列式、rank秩、trace迹、eig特征值和特征向量、svd奇异值分解、norm范数、cond条件数统计类sum求和、mean均值、median中位数、std标准差、max最大值、min最小值、sort排序数组操作类diff差分、cumsum累积和、flip翻转、unique去重。举个例子A [1 2 3; 4 5 6; 7 8 10]; sum(A) % 默认对每一列求和结果[12 15 19] sum(A, 2) % 对每一行求和结果[6; 15; 25] max(A, [], 1) % 对每一列取最大值 max(A, [], 2) % 对每一行取最大值注意max和min的写法很特别想按维度求值时要传一个空数组[]作为第二个参数否则max(A)会把整个矩阵当成一个向量来比较。这个小细节踩一次就记住了。5. 矩阵形变与批量处理技巧5.1 reshape的列优先陷阱与permute的正确用法reshape可以把矩阵改成任意维度只要元素总数不变。例如A 1:12; B reshape(A, 3, 4);结果B是3行4列但顺序是列优先填充的第一列是1、2、3第二列是4、5、6如此类推。如果你想按行优先的顺序重新排布必须先对原数据做一些处理。一个常见需求是你有一个按行采集的信号序列想把它重排成多行多列但reshape默认按列排可能会打乱信号顺序。这时可以用转置或permute来解决。比如把行向量1:12变成3行4列且按行顺序排列可以先reshape再转置B reshape(A, 4, 3);permute是高维版的“转置”适合处理三维矩阵的维度交换。比如permute(M, [2 1 3])会把前两维互换。对于初学者我建议先用permute做实验观察维度变化理解后再用于更复杂的数据处理。5.2 用find与逻辑矩阵做批量筛选在数据处理中经常需要知道哪些元素满足条件以及它们的位置。find是解决这个问题的利器。A [10 20 30; 40 50 60]; [row, col] find(A 25); linearIndex find(A 25);不带赋值时find(A 25)返回满足条件的线性索引向量。如果你写成[row, col] find(...)则返回行列下标。这个行为与逻辑索引互补逻辑索引直接给你值find给你位置两者结合可以高效地对满足条件的位置做修改。比如你想把矩阵中所有大于100的替换为100可以直接用A(A100)100但如果你想以某个特定顺序逐个修改这些位置那就需要先拿到线性索引再循环处理。5.3 隐式扩展自动广播维度的新特性从R2016b开始MATLAB支持隐式扩展让不同维度的矩阵在操作时自动扩展。比如A [1 2 3; 4 5 6]; b [10; 20]; C A b;这里A是2×3b是2×1。按照老版本规则维度不一致会报错新版本里b会沿着列方向自动复制成2×3然后再相加。同理A - [1 2 3]会把行向量自动复制到每一行。这个功能很方便但也带来隐患如果代码里有维度不匹配的bug不再报错而是默默做广播产生一个很大但很蠢的结果。我的建议是利用隐式扩展时务必先用size确认原来矩阵的形状特别是做矩阵和向量混合运算时最好心里明确哪个维度会被扩展。5.4 利用all、any和逻辑运算简化判断当你想检查矩阵中是否所有元素满足条件、是否存在某些元素满足条件all和any是必用的。A [1 2 3; 4 5 6]; all(A 0) % 返回 [1 1 1]因为每列所有元素都大于0 any(A 5, 2) % 对每一行判断返回 [0; 1]配合方向参数可以处理行和列两个维度。比如你想筛选出所有行中至少含有一个大于5的行可以用rows any(A 5, 2); selected A(rows, :);这种写法比循环简洁得多也是“向量化思维”的典型例子。矩阵基础学得好不好一个很重要的标志就是你写代码时还会不会动不动就写for循环。6. MATLAB矩阵编程常见问题与避坑6.1 索引越界和维度不一致我见过最多的报错就是“Index exceeds the number of array elements”和“Matrix dimensions must agree”。索引越界通常是因为你用了固定大小去访问动态矩阵比如在循环里只判断了行数没判断列数。解决这类问题的关键是每次操作前想清楚矩阵当前的实际大小可以用size、numel确认。维度不一致则多发生在点运算时两个矩阵需要对位相乘结果一个2×3一个3×2直接报错。遇到这种情况我通常会立刻检查两个矩阵的size输出重点看是不是转置忘了写。这类错误在脚本运行中很常见但定位并不难难的是你是否养成了先查看维度的习惯。6.2 循环中动态增长矩阵导致性能骤降一个反例x 1:10000; y []; for i 1:length(x) y(i) x(i)^2; end这段代码本身没有错但每次循环都要给y重新分配内存运行会特别慢。正确的写法是y zeros(size(x)); for i 1:length(x) y(i) x(i)^2; end更好的是直接向量化y x.^2;用tic和toc测一下你会发现向量化比循环快几个数量级。这不是鼓励初学者一开始就拒绝循环而是提醒你当数据量大了矩阵化思维才是MATLAB的看家本领。6.3 浮点数比较别用等号由于浮点数的二进制表示有误差A中某个数值即使看起来等于0.1实际存储可能是0.10000000000000001。因此判断矩阵中哪些元素等于某个特定小数时不建议用A 0.1而应该用tol 1e-8; A(abs(A - 0.1) tol) 0;这个技巧在做数值计算时非常重要尤其是在处理迭代法收敛判断、滤波器系数比较时。直接等号比较往往找不齐目标元素或者误判数值导致结果偏离预期。6.4 变量名与内置函数冲突矩阵基础知识虽然简单但有一个特别隐蔽的坑变量名会覆盖函数名。比如你定义一个变量叫zeros之后调用zeros(3,3)就会出错。因为MATLAB解析变量名的优先级高于函数。我的建议是永远不用内置函数名作为变量名比如不要用sum、max、mean、size。写代码时可以先运行which size检查某个名字是否被占用。还有一个容易忽略的点MATLAB对大小写敏感。A和a是两个不同的变量。在长脚本里大小写混乱很容易导致“Undefined function or variable”错误。统一驼峰或小写命名能减少这类问题。6.5 分号、清屏与脚本调试的细节命令窗口直接执行语句时如果想看到结果就不加分号如果想隐藏结果就加分号。在脚本编辑器中建议默认加避免中间过程输出刷屏。调试矩阵相关代码时我通常会这样操作在关键行前面去掉分号运行一次或者用disp打印size(A)也可以用whos查看所有变量的大小和类型这个命令比who更详细。如果发现某个变量维度不对可以用clear A单独清除它而不是动不动就clear all否则脚本里其他变量全没了前功尽弃。最后再分享一个小技巧在命令窗口输入doc size或者help reshape能直接打开官方文档里面有很多示例比网上搜到的二手答案靠谱得多。我当年学矩阵基础时就是靠“遇到不懂就doc”这个习惯把repmat、reshape、logical indexing这些概念真正用熟的。矩阵基础这块内容看似琐碎但它是后续所有MATLAB应用的地基哪怕你后面去做图像处理、数值分析、深度学习理解矩阵怎么存、怎么取、怎么算永远绕不开。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询