MATLAB 命令速查表 - MATLAB 常用命令与矩阵操作大全

这套速查专给做数值计算与工程仿真的开发者:用矩阵而不是逐元素循环来组织计算,快速读取实验或传感器数据、画图观察趋势、再用内置函数做傅里叶或特征分析。与 numpy 的 . 逐元素运算符不同,MATLAB 的乘法、转置、求逆都是直接对矩阵整体生效,这里按“建矩阵→改矩阵→算统计→画图→落盘”顺序分节,可边跑边抄。读完你应能徒手建出矩阵并做转置、求逆、特征分解与左除解方程组,把数据画成 plot/scatter/直方图,并用 save/load 保存中间结果。

编程语言·共 83 条命令·最后更新 2026-07-21
matlab科学计算矩阵

典型使用场景

面向用 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]
创建 3x3 矩阵
B = [1; 2; 3]
创建列向量
C = [1, 2, 3]
创建行向量
D = zeros(3, 4)
创建 3x4 零矩阵
E = ones(2, 3)
创建 2x3 全 1 矩阵
F = eye(3)
创建 3x3 单位矩阵
G = rand(3, 3)
创建 3x3 随机矩阵
H = linspace(0, 10, 100)
创建 0-10 的 100 个等间距点

矩阵操作 11

A'
矩阵转置,m×n 变 n×m;对复矩阵 A' 还做共轭,仅转置请用 A.'
inv(A)
求逆,要求方阵且行列式非零;解方程更推荐用 x = A\b 代替显式求逆,数值更稳定
det(A)
行列式,常用来判断矩阵是否奇异:非零才可求逆
rank(A)
矩阵秩,即线性无关行(列)的最大数量
trace(A)
矩阵迹(对角线元素之和)
eig(A)
特征值和特征向量
svd(A)
奇异值分解
A * B
矩阵乘法,维度须匹配:A(m×k) 乘 B(k×n) 得 C(m×n)
A .* B
元素对应相乘,两个矩阵形状须一致,逐元素计算
A / B
矩阵右除(A * inv(B))
A \ B
矩阵左除(inv(A) * 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 轴")
设置 X 轴标签
ylabel("Y 轴")
设置 Y 轴标签
legend("曲线 1", "曲线 2")
添加图例
grid on
显示网格
hold on
保持当前图形,继续绘制
hold off
释放图形保持
subplot(2, 2, 1)
创建 2x2 子图中的第 1 个

数据处理 12

mean(A)
沿首维计算均值;对矩阵默认按列求平均,想按行请用 mean(A, 2)
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")
加载 MAT 文件
save("data.mat", "var")
保存变量到 MAT 文件
data = csvread("file.csv")
读取 CSV 文件
csvwrite("file.csv", data)
写入 CSV 文件
data = xlsread("file.xlsx")
读取 Excel 文件
xlswrite("file.xlsx", data)
写入 Excel 文件
fid = fopen("file.txt", "r")
打开文本文件
fclose(fid)
关闭文件
fscanf(fid, "%f", [1, inf])
读取文件内容
fprintf(fid, "%f\n", data)
写入文件内容

编程基础 10

for i = 1:10 ... end
for 循环:for i = 1:10 会依次把 i 取为 1 到 10 逐次执行循环体
while condition ... end
while 循环:每次进入前判断条件,为真才继续执行
if condition ... elseif ... else ... end
条件判断,从上到下命中第一个为真的分支
switch expr case val1 ... otherwise ... end
switch 语句
function [out] = func(in) ... end
定义函数
% 注释
单行注释
%{ 多行注释 %}
多行注释
disp("message")
显示消息
fprintf("格式 %d\n", var)
格式化输出
input("提示: ")
用户输入

线性代数 9

A * x = b
解线性方程组
x = A \ b
左除求解
[L, U, P] = lu(A)
LU 分解
[Q, R] = qr(A)
QR 分解
[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. 1确认矩阵是否可逆、是否病态

    det(A); rank(A); cond(A)

    det 为 0 或 rank 明显小于阶数说明矩阵奇异、无法求逆;cond 数值很大(如 1e10 量级)说明解对扰动极敏感,应当检查数据量纲或改用最小二乘思路而非直接求逆。

  2. 2区分矩阵乘与元素乘

    size(A); size(B); C = A .* B; D = A * B;

    先看 size 输出确认两个矩阵形状;. * 结果与输入同形,* 的结果尺寸按内积规则变化。若 .* 报维度不一致,是两个操作数形状不同,需先用 ones/zeros 或 reshape 类思路对齐,脚本里常见做法是先 zeros(m,n) 预分配。

  3. 3统计量方向不确定时同时打印两种口径

    colMean = mean(A); rowMean = mean(A, 2); size(colMean), size(rowMean)

    对 3x4 矩阵,mean(A) 返回 1x4(每列一个均值),mean(A,2) 返回 3x1(每行一个均值)。对比两者 size 就能立刻判断哪个是你要的维度。

  4. 4多条曲线叠加绘制

    hold on; plot(x, y1); plot(x, y2); legend("曲线 1", "曲线 2"); hold off

    hold on 之后每次 plot 复用同一坐标轴,两条曲线同时可见;legend 需与绘制顺序一致,否则图例与线条对不上。结束时 hold off 让后续绘图恢复正常重绘行为。

  5. 5多子图排版与定位

    subplot(2, 2, 1); plot(x, y1); subplot(2, 2, 2); scatter(x, y2)

    subplot(2,2,k) 把当前坐标轴切到 2x2 网格的第 k 格,连续调用即可铺满四格。忘记 subplot 会导致后一图覆盖前一图。

  6. 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 \ b

x = 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 on

plot(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日,内容持续校对官方文档。

联系我们

命令或描述有误?提交反馈、商务合作或产品建议都可发送邮件给我们。

联系我们