### 文章目录
- [@toc](#文章目录 @[toc] 矩阵生成的多种方式 矩阵索引:MATLAB最核心的技能 矩阵拼接与重塑 点运算 vs 矩阵运算 矩阵的增删改 矩阵信息查询 常见错误与调试技巧 实战技巧)
- [矩阵生成的多种方式](#文章目录 @[toc] 矩阵生成的多种方式 矩阵索引:MATLAB最核心的技能 矩阵拼接与重塑 点运算 vs 矩阵运算 矩阵的增删改 矩阵信息查询 常见错误与调试技巧 实战技巧)
- [矩阵索引:MATLAB最核心的技能](#文章目录 @[toc] 矩阵生成的多种方式 矩阵索引:MATLAB最核心的技能 矩阵拼接与重塑 点运算 vs 矩阵运算 矩阵的增删改 矩阵信息查询 常见错误与调试技巧 实战技巧)
- [矩阵拼接与重塑](#文章目录 @[toc] 矩阵生成的多种方式 矩阵索引:MATLAB最核心的技能 矩阵拼接与重塑 点运算 vs 矩阵运算 矩阵的增删改 矩阵信息查询 常见错误与调试技巧 实战技巧)
- [点运算 vs 矩阵运算](#文章目录 @[toc] 矩阵生成的多种方式 矩阵索引:MATLAB最核心的技能 矩阵拼接与重塑 点运算 vs 矩阵运算 矩阵的增删改 矩阵信息查询 常见错误与调试技巧 实战技巧)
- [矩阵的增删改](#文章目录 @[toc] 矩阵生成的多种方式 矩阵索引:MATLAB最核心的技能 矩阵拼接与重塑 点运算 vs 矩阵运算 矩阵的增删改 矩阵信息查询 常见错误与调试技巧 实战技巧)
- [矩阵信息查询](#文章目录 @[toc] 矩阵生成的多种方式 矩阵索引:MATLAB最核心的技能 矩阵拼接与重塑 点运算 vs 矩阵运算 矩阵的增删改 矩阵信息查询 常见错误与调试技巧 实战技巧)
- [常见错误与调试技巧](#文章目录 @[toc] 矩阵生成的多种方式 矩阵索引:MATLAB最核心的技能 矩阵拼接与重塑 点运算 vs 矩阵运算 矩阵的增删改 矩阵信息查询 常见错误与调试技巧 实战技巧)
- [实战技巧](#文章目录 @[toc] 矩阵生成的多种方式 矩阵索引:MATLAB最核心的技能 矩阵拼接与重塑 点运算 vs 矩阵运算 矩阵的增删改 矩阵信息查询 常见错误与调试技巧 实战技巧)
矩阵运算是MATLAB的灵魂,也是它名字的由来(MATrix LABoratory)。掌握矩阵思维,你的代码会比循环实现简洁10倍,速度快100倍。这篇文章把矩阵的生成、索引、运算全讲透。
矩阵生成的多种方式
直接定义:
matlab
A = [1 2 3; 4 5 6; 7 8 9]; % 3x3矩阵,空格或逗号分隔列,分号分隔行
B = [1, 2, 3; 4, 5, 6]; % 2x3矩阵
v = [1 2 3 4 5]; % 行向量
特殊矩阵生成:
matlab
zeros(3, 4) % 3行4列全零矩阵
ones(2, 5) % 2行5列全1矩阵
eye(4) % 4阶单位矩阵
diag([1 2 3]) % 对角矩阵,对角线为[1 2 3]
tril(ones(3)) % 下三角矩阵
triu(ones(3)) % 上三角矩阵
随机矩阵:
matlab
rand(3, 4) % 均匀分布随机数,[0,1]区间
randn(3, 4) % 标准正态分布随机数,均值0方差1
randi([1, 10], 3, 4) % 整数随机矩阵,范围[1,10]
% 设置随机种子(使结果可重复)
rng(42);
A = rand(3);
等差数列与网格:
matlab
% 冒号生成向量
x = 0:5 % [0 1 2 3 4 5]
x = 0:0.5:2 % [0 0.5 1.0 1.5 2.0],步长0.5
x = 10:-1:5 % [10 9 8 7 6 5],递减
% linspace:指定点数
linspace(0, 1, 5) % [0 0.25 0.5 0.75 1],0到1之间5个点
% logspace:对数等间距
logspace(0, 3, 4) % [10^0 10^1 10^2 10^3] = [1 10 100 1000]
% 网格矩阵(三维绘图常用)
[X, Y] = meshgrid(1:3, 1:2);
% X = [1 2 3; 1 2 3]
% Y = [1 1 1; 2 2 2]
矩阵索引:MATLAB最核心的技能
MATLAB索引从1开始(不是0),这是和C/Python的最大区别。
基础索引:
matlab
A = magic(4); % 生成4x4魔方矩阵
A(2, 3) % 第2行第3列元素
A(1, :) % 第1行所有元素(行向量)
A(:, 3) % 第3列所有元素(列向量)
A(2:3, 1:2) % 子矩阵:第2-3行,第1-2列
% end关键字:表示最后一个索引
A(end, :) % 最后一行
A(:, end) % 最后一列
A(end-1, end) % 倒数第二行、最后一列
A(2:end, :) % 第2行到最后一行
单下标索引:
MATLAB内部按列存储矩阵,可以用单个索引访问:
matlab
A = [1 2 3; 4 5 6]; % 2x3矩阵
A(3) % 5(第3个元素,列优先顺序)
% 索引顺序:A(1)=1, A(2)=4, A(3)=2, A(4)=5, A(5)=3, A(6)=6
% 线性索引转下标
[row, col] = ind2sub([2,3], 5); % 第5个元素在第1行第3列
% 下标转线性索引
idx = sub2ind([2,3], 1, 3); % 第1行第3列是第5个元素
逻辑索引(最实用):
matlab
A = [3, 7, 2, 9, 4, 6, 1, 8];
% 取出大于5的元素
A(A > 5) % [7 9 6 8]
% 把小于4的元素置零
A(A < 4) = 0; % A变为[3 7 0 9 4 6 0 8]
% 找出满足条件的索引位置
idx = find(A > 5); % 返回索引位置
A(idx) % 等价于A(A>5)
% 多条件逻辑
A(A > 3 & A < 8) % 大于3且小于8的元素
% 逻辑索引的典型应用:数据清洗
data = [1.2, NaN, 3.5, Inf, 2.8, -Inf];
data(isnan(data) | isinf(data)) = []; % 删除NaN和Inf
逻辑索引可以替代90%的循环判断,是MATLAB数据处理的核心技巧。
矩阵拼接与重塑
拼接:
matlab
A = [1 2; 3 4];
B = [5 6; 7 8];
% 水平拼接(增加列)
C = [A, B]; % 或 [A B]
C = cat(2, A, B); % 沿第2维拼接
% 垂直拼接(增加行)
D = [A; B];
D = cat(1, A, B); % 沿第1维拼接
% 沿第三维拼接(形成三维数组)
E = cat(3, A, B); % E是2x2x2的三维数组
重塑:
matlab
A = 1:12; % [1 2 3 ... 12]
B = reshape(A, 3, 4); % 重塑为3x4矩阵(按列填充)
% B = [1 4 7 10; 2 5 8 11; 3 6 9 12]
C = reshape(A, 2, []); % 自动计算列数
% 转置
A = [1 2 3; 4 5 6];
A' % 2x3 -> 3x2
% 对于复数矩阵,'是共轭转置,.'是普通转置
Z = [1+2i, 3+4i];
Z' % 共轭转置
Z.' % 不共轭转置
复制与扩展:
matlab
A = [1 2; 3 4];
% repmat:复制整个矩阵
B = repmat(A, 2, 3); % 垂直复制2次,水平复制3次
% repelem:复制每个元素
C = repelem(A, 2, 2); % 每个元素复制成2x2块
点运算 vs 矩阵运算
这是MATLAB最容易混淆的地方,必须搞清楚:
矩阵运算(线性代数):
matlab
A = [1 2; 3 4];
B = [5 6; 7 8];
A * B % 矩阵乘法(要求维度匹配)
A ^ 2 % 矩阵的平方,等于A*A
inv(A) % 矩阵的逆
A / B % 矩阵右除,A * inv(B)
A \ B % 矩阵左除,inv(A) * B
点运算(元素对应运算):
matlab
A .* B % 元素对应相乘
A ./ B % 元素对应相除
A .^ 2 % 每个元素平方
sqrt(A) % 每个元素开方(等价于A.^0.5)
什么时候用哪个?
- 线性方程组、状态空间、控制系统 :用矩阵运算
*/\ - 信号处理、图像处理、物理仿真 :用点运算
.*./.^
matlab
% 错误示例:求向量每个元素的平方
x = [1 2 3 4];
x ^ 2 % 报错!向量不能做矩阵幂运算
% 正确:
x .^ 2 % [1 4 9 16]
% 实际应用:计算距离
x = [1, 2, 3];
y = [4, 5, 6];
dist = sqrt(sum((x - y).^2)); % 欧氏距离
矩阵的增删改
删除行列:
matlab
A = magic(4);
A(2, :) = []; % 删除第2行
A(:, 3) = []; % 删除第3列
A([1,3], :) = []; % 删除第1和第3行
插入行列:
MATLAB没有直接插入的语法,通过拼接实现:
matlab
A = [1 2; 3 4];
newRow = [5 6];
% 在第2行后插入
A = [A(1,:); newRow; A(2:end,:)];
修改元素:
matlab
A = magic(3);
A(2, 3) = 100; % 修改单个元素
A(1, :) = [7 7 7]; % 修改整行
A(A < 5) = 0; % 条件批量修改
矩阵信息查询
matlab
A = [1 2 3; 4 5 6];
size(A) % [2, 3],返回行列数
size(A, 1) % 2,行数
size(A, 2) % 3,列数
length(A) % 3,较长维度
numel(A) % 6,总元素数
isempty(A) % 是否为空矩阵
isscalar(A) % 是否为标量
isvector(A) % 是否为向量
ismatrix(A) % 是否为矩阵(总是true)
常见错误与调试技巧
1. 维度不匹配
matlab
A = [1 2 3];
B = [4; 5; 6];
A * B % 正确:1x3 * 3x1 = 标量
A + B % 错误:维度不匹配(但R2016b后支持隐式扩展)
2. 矩阵与标量运算
标量会自动扩展到和矩阵相同大小:
matlab
A = [1 2 3; 4 5 6];
A + 10 % 每个元素加10
A * 2 % 每个元素乘2
3. 索引越界
matlab
A = [1 2 3];
A(5) % 错误:索引超出范围
% 安全的条件访问
if length(A) >= 5
val = A(5);
end
4. 忘记用点运算
matlab
x = [1 2 3];
y = [4 5 6];
x * y % 错误!维度不匹配
x .* y % 正确:[4 10 18]
实战技巧
批量运算替代循环:
matlab
% 慢速循环版本
result = zeros(1, 1000);
for i = 1:1000
result(i) = sin(i) * cos(i);
end
% 向量化版本(快100倍)
x = 1:1000;
result = sin(x) .* cos(x);
逻辑索引做数据筛选:
matlab
% 实验数据,去除异常值(超出均值±3倍标准差)
data = randn(1, 1000);
mu = mean(data);
sigma = std(data);
cleanData = data(abs(data - mu) < 3*sigma);
矩阵掩码:
matlab
% 图像处理:只处理感兴趣区域
img = rand(100, 100);
mask = (img > 0.5); % 逻辑掩码
img(mask) = img(mask) * 2; % 对掩码区域增强