MATLAB 命令速查表 - MATLAB 常用命令与矩阵操作大全
这套速查专给做数值计算与工程仿真的开发者:用矩阵而不是逐元素循环来组织计算,快速读取实验或传感器数据、画图观察趋势、再用内置函数做傅里叶或特征分析。与 numpy 的 . 逐元素运算符不同,MATLAB 的乘法、转置、求逆都是直接对矩阵整体生效,这里按“建矩阵→改矩阵→算统计→画图→落盘”顺序分节,可边跑边抄。读完你应能徒手建出矩阵并做转置、求逆、特征分解与左除解方程组,把数据画成 plot/scatter/直方图,并用 save/load 保存中间结果。
典型使用场景
面向用 MATLAB 做数值计算、算法验证与教学演示的工程与科研人员。本表的价值在于把最常出事的三组语义钉死:* 矩阵乘与 .* 元素乘、A\b 左除求解与 inv(A)*b 的数值稳定性差、mean(A) 默认沿首维(对矩阵即按列)而 mean(A,2) 才按行。再加上 A' 对复矩阵做共轭转置、仅转置要用 A.' 这个几乎人人踩过的点。日常流程上,从 linspace 生成自变量、构造矩阵、mean/std/sort 做统计、再到 plot/hold on/subplot 出图,配合 csvread/csvwrite 与 fopen/fprintf 读写数据,构成一条完整的「读数据→算结果→画图→存结果」闭环,遇到图不显示或结果不对时按排障段逐步走。
矩阵创建 8
A = [1 2 3; 4 5 6; 7 8 9]B = [1; 2; 3]C = [1, 2, 3]D = zeros(3, 4)E = ones(2, 3)F = eye(3)G = rand(3, 3)H = linspace(0, 10, 100)矩阵操作 11
A'inv(A)det(A)rank(A)trace(A)eig(A)svd(A)A * BA .* BA / BA \ B数据可视化 16
plot(x, y)scatter(x, y)bar(x, y)hist(data)pie(data)surf(X, Y, Z)mesh(X, Y, Z)contour(X, Y, Z)title("标题")xlabel("X 轴")ylabel("Y 轴")legend("曲线 1", "曲线 2")grid onhold onhold offsubplot(2, 2, 1)数据处理 12
mean(A)median(A)std(A)var(A)max(A)min(A)sum(A)cumsum(A)diff(A)sort(A)unique(A)find(A > 5)文件操作 10
load("data.mat")save("data.mat", "var")data = csvread("file.csv")csvwrite("file.csv", data)data = xlsread("file.xlsx")xlswrite("file.xlsx", data)fid = fopen("file.txt", "r")fclose(fid)fscanf(fid, "%f", [1, inf])fprintf(fid, "%f\n", data)编程基础 10
for i = 1:10 ... endwhile condition ... endif condition ... elseif ... else ... endswitch expr case val1 ... otherwise ... endfunction [out] = func(in) ... end% 注释%{ 多行注释 %}disp("message")fprintf("格式 %d\n", var)input("提示: ")线性代数 9
A * x = bx = A \ b[L, U, P] = lu(A)[Q, R] = qr(A)[U, S, V] = svd(A)norm(A)cond(A)null(A)orth(A)信号处理 7
fft(x)ifft(X)conv(x, y)xcorr(x, y)filter(b, a, x)spectrogram(x)psd(x)参数矩阵
| 参数 | 作用 | 示例 |
|---|---|---|
A = [1 2 3; 4 5 6; 7 8 9] | 分号分行创建 3x3 矩阵 | A = [1 2 3; 4 5 6; 7 8 9] |
zeros(m,n) | 创建 m×n 零矩阵,预分配底稿 | D = zeros(3, 4) |
ones(m,n) | 创建 m×n 全 1 矩阵 | E = ones(2, 3) |
eye(n) | 创建 n×n 单位矩阵 | F = eye(3) |
rand(m,n) | 创建 m×n 随机矩阵 | G = rand(3, 3) |
linspace(a,b,n) | 生成 a 到 b 的 n 个等间距点 | H = linspace(0, 10, 100) |
A' / A.' | 共轭转置 / 仅转置(复数数据务必用 .') | C = A'; |
x = A \ b | 左除求解线性方程组,数值比 inv(A)*b 稳 | x = A \ b |
inv(A) | 显式求逆,要求方阵且 det 非零 | B = inv(A) |
det(A) / rank(A) | 行列式与秩,判断是否奇异 | det(A) |
cond(A) | 条件数,衡量解的稳定性 | cond(A) |
A .* B | 元素对应相乘,形状须一致 | C = A .* B |
mean(A) / mean(A,2) | 沿首维(按列)/ 沿二行(按行)求均值 | m = mean(A, 2) |
std(A) / var(A) | 标准差与方差 | s = std(A) |
sort(A) / unique(A) | 排序与去重 | idx = find(A > 5) |
subplot(2,2,k) | 在 2x2 子图网格中定位第 k 幅图 | subplot(2, 2, 1) |
hold on / hold off | 保持图形继续绘制 / 释放保持 | hold on; plot(x, y); hold off |
fft(x) / ifft(X) | 快速傅里叶变换与其逆变换 | X = fft(x) |
filter(b, a, x) | 按分子分母系数做数字滤波 | y = filter(b, a, x) |
save("f.mat","var") | 把变量写入 MAT 文件 | save("data.mat", "var") |
csvread / csvwrite | 读入 / 写出 CSV 文件 | csvwrite("file.csv", data) |
易错点与避坑指南
现象两个同样形状的矩阵相乘,结果维度变成 9x9 或直接报错,元素对不上
原因用了矩阵乘 * 而不是元素乘 .*;* 按行列内积展开,形状要求是 A(m×k) 乘 B(k×n)。
处置需要逐元素运算时改成 A .* B、B ./ B、A .^ 2;只有做线性代数乘法时才用 *。
现象复数数据转置后数值出现异常(虚部符号翻转),结果和手算对不上
原因A' 是共轭转置,会同时对虚部取共轭;只想做单纯转置时用错了它。
处置复数矩阵仅转置(不共轭)请写 A.',例如 C = A.'。
现象解方程结果出现巨大数值或满屏 NaN/Inf,换个数据就完全不对
原因显式调用 inv(A) 再乘 b 引入两次求逆,数值误差被放大;且矩阵接近奇异时 det 本身就很小。
处置改用左除 x = A \ b,并先用 det(A)、rank(A)、cond(A) 判断矩阵是否病态。
现象按行统计却拿到按列的结果,行数与预期不一致
原因mean(A)、sum(A)、std(A) 默认沿首维(dim=1),对矩阵就是逐列聚合。
处置按行请显式写 mean(A, 2)、std(A, 2)、sum(A, 2)。
现象连续调用两次 plot,第二条曲线覆盖第一条,figure 里只剩一条线
原因plot 每次会清空当前坐标轴并重绘,除非显式保持图形。
处置在第一次 plot 前加 hold on,全部画完后再 hold off 释放。
现象定义了函数并在脚本里调用,报「未定义函数」或找不到文件
原因函数必须与文件名同名:写 function [out] = myfunc(in) 就必须存为 myfunc.m,且该目录需在搜索路径上。
处置把函数单独保存为 myfunc.m 放在脚本同目录(或用 addpath 加入路径),再调用 myfunc(...)。
现象load("data.mat") 之后工作区里没有变量,或报文件不存在
原因load 默认使用 MAT 格式且相对当前工作目录查找,路径写相对路径时基准不是脚本所在目录。
处置用绝对路径或先切换目录:load("D:/data/data.mat");不确定变量名时先在命令行查看已加载内容。
排障路径
1确认矩阵是否可逆、是否病态
det(A); rank(A); cond(A)det 为 0 或 rank 明显小于阶数说明矩阵奇异、无法求逆;cond 数值很大(如 1e10 量级)说明解对扰动极敏感,应当检查数据量纲或改用最小二乘思路而非直接求逆。
2区分矩阵乘与元素乘
size(A); size(B); C = A .* B; D = A * B;先看 size 输出确认两个矩阵形状;. * 结果与输入同形,* 的结果尺寸按内积规则变化。若 .* 报维度不一致,是两个操作数形状不同,需先用 ones/zeros 或 reshape 类思路对齐,脚本里常见做法是先 zeros(m,n) 预分配。
3统计量方向不确定时同时打印两种口径
colMean = mean(A); rowMean = mean(A, 2); size(colMean), size(rowMean)对 3x4 矩阵,mean(A) 返回 1x4(每列一个均值),mean(A,2) 返回 3x1(每行一个均值)。对比两者 size 就能立刻判断哪个是你要的维度。
4多条曲线叠加绘制
hold on; plot(x, y1); plot(x, y2); legend("曲线 1", "曲线 2"); hold offhold on 之后每次 plot 复用同一坐标轴,两条曲线同时可见;legend 需与绘制顺序一致,否则图例与线条对不上。结束时 hold off 让后续绘图恢复正常重绘行为。
5多子图排版与定位
subplot(2, 2, 1); plot(x, y1); subplot(2, 2, 2); scatter(x, y2)subplot(2,2,k) 把当前坐标轴切到 2x2 网格的第 k 格,连续调用即可铺满四格。忘记 subplot 会导致后一图覆盖前一图。
6读写 CSV 与文本文件
data = csvread("file.csv"); csvwrite("out.csv", data); fid = fopen("log.txt","w"); fprintf(fid, "%f\n", data); fclose(fid)csvread/csvwrite 适合纯数值表格;需要带表头或非数值内容时改用 fopen 打开文本流,用 fprintf 按格式写出、fclose 关闭句柄。忘记 fclose 会导致末尾数据未落盘。
命令示例
矩阵奇异时 det 与 rank 立刻暴露问题
A = [1 2 3; 4 5 6; 7 8 9]
det(A)
rank(A)这张「1 到 9」的矩阵第三行是第一行加第二行,行列式必然为 0、秩只有 2。用 det/rank 先验证可逆性,再决定能不能求逆,能省掉后面一堆看不懂的报错。
输出
ans =
0
ans =
2解线性方程组优先用左除而非 inv
A = [2 1; 1 3]
b = [5; 10]
x = A \ bx = A \ b 在数值上比 x = inv(A)*b 更稳定,因为左除不会真的算出一个巨大的逆矩阵再相乘。写 inv(A) 再乘回去是大忌,条件数高的矩阵会明显掉精度。
输出
x =
1
3分解家族按问题类型选
A = [4 1; 1 3]
[L, U, P] = lu(A)
[Q, R] = qr(A)
[U, S, V] = svd(A)LU 用于求解与行列式,QR 用于最小二乘,SVD 用于降维与最小二乘的数值最稳解。三者对同一个方阵都能算,但选错的代价比写错一行代码大得多。
一条命令画完带标注的多条曲线
x = linspace(0, 10, 100)
plot(x, sin(x), x, cos(x))
title("正弦与余弦")
legend("sin", "cos")
xlabel("X 轴")
ylabel("Y 轴")
grid onplot(x, y1, x, y2) 一次画两条线,之后 title / legend / xlabel / grid 是往当前图上叠加的;漏掉 hold on 时每句绘图命令都会清空前一张图。
输出
ans =
Columns 1 through 2
0 1.0000
按条件挑元素而不是写双重循环
A = [1 2 3; 4 5 6; 7 8 9]
find(A > 5)
mean(A)
unique([1 1 2 3 3])find 返回的是线性索引而不是坐标对,配 size 还原成行列才看得懂。mean 对矩阵默认沿首维(按列)求平均,想按行要用 mean(A, 2)。
输出
ans =
6 7 8 9
ans =
4 5 6
ans =
1 2 3常见坑与注意事项
- A' 对复数矩阵做的是共轭转置,只想要转置必须写 A.';向量用错会得到完全不同的数值结果。
- 在循环里用 end 作下标(a(end))后又在循环体外读取同一变量,索引含义会随循环漂移,结果静默出错而不报错。
- 不用分号结束语句会把巨大矩阵打印到命令窗口,几千个元素就足以让编辑器卡死;脚本里养成每句都带分号的习惯。
- for i = 1:10 会依次把 i 取为 1 到 10(含 10,共十次)。写成 1:10 参与除法或作下标边界时,差一个元素就是差一整行结果。
- 数组下标从 1 开始而不是 0:a(0) 报索引超出范围,a(end+1) 才是追加元素。移植 Python/JS 逻辑时常在这里整段错位。
- clear all 会清掉断点和工作区变量,调试脚本中途执行一次,后续所有变量变成 undefined 且断点失效,排查会非常困惑。
提示
- MATLAB 索引从 1 开始,不是从 0 开始(与 Python/C 不同)。
- 矩阵乘法用 *,元素对应乘法用 .*,注意区分。
- plot 函数会自动连接数据点,绘制曲线;scatter 绘制散点图。
- hold on 可以在同一图上绘制多条曲线,hold off 释放保持。
- load 和 save 默认使用 MAT 格式,csvread/csvwrite 用于 CSV 文件。
- 函数文件必须以函数名同名,如 function [out] = myfunc(in) 保存为 myfunc.m。
- 使用 help 命令查看函数帮助,如 help plot。
- 使用 doc 命令打开完整文档,如 doc plot。
常见问题
为什么解线性方程组推荐 x = A \ b 而不是先求逆再乘?
inv(A) 会显式算出 A 的逆矩阵,再与 b 相乘,过程中引入两次舍入误差,且必须先确认 det(A) 非零、A 是方阵。x = A \ b 由求解器内部直接完成,数值稳定性明显更好。若只是想知道矩阵是否可逆,用 det(A) 或 rank(A) 判断行列式是否为零即可,无需真的把 inv 算出来。
画多条曲线时第二条曲线不见了,是哪里写错了?
这是 MATLAB 每次 plot 都会清空当前图形导致的。正确做法是在第一次 plot 之后调用 hold on,让后续的 plot、scatter、bar 叠加到同一张图上;画完所有序列后用 hold off 释放,否则下一段脚本又会继承这个状态。多子图时用 subplot(2, 2, 1) 先定位画布,再在该子图上 hold on 绘制。
复数矩阵转置时用 A' 还是 A.',两者差在哪?
A' 做的是共轭转置,会把虚部符号一并翻转,是数学上正确的复数转置;A.' 只做纯转置,不动虚部。实数矩阵上两者结果完全相同,所以平时看不出区别,但处理 fft 得到的频谱(ifft 之后往往是复数)时若误用 A',频谱相位会出现符号错误。信号处理里做 fft 后把复数序列转成实部虚部两列时,应显式用 A.'。
mean(A) 对矩阵求平均,什么时候结果和自己预期的不一样?
mean(A) 默认沿首维收缩,对矩阵而言就是逐列求平均,得到一个 1×n 行向量。若你心里想的是「每一行一个样本的平均值」,必须写成 mean(A, 2),结果是 m×1 列向量。std、sum、max、min、cumsum、diff 都遵循同样的首维规则,换维度时都要补上第二个参数,别默认它们会自动按行处理。
MAT 文件和 CSV 之间怎么选,跨工具交换数据时踩过什么坑?
load("data.mat") 与 save("data.mat", "var") 走的是 MAT 格式,能完整保留矩阵类型、维度甚至复数,但只有 MATLAB 读得了;csvread("file.csv") 与 csvwrite("file.csv", data) 输出纯文本,任何工具都能解析,代价是一维向量与二维矩阵的形状信息容易丢失。经验做法:程序内部一律 MAT 存中间结果,只在导出给他人或交给 Python 时转 CSV。
由 巧匠 维护
公开更新于 2026年7月21日,内容持续校对官方文档。