MATLAB矩阵运算完全指南:从生成到索引操作

### 文章目录

  • [@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;  % 对掩码区域增强
相关推荐
红叶舞1 小时前
基于线段树的数据结构
数据结构·python·算法
断点之下2 小时前
从“理扑克牌”到“分组优化”——直接插入排序与希尔排序详解
数据结构·算法·排序算法
起个破名想半天了2 小时前
算法与数据结构之DFS深度优先遍历
数据结构·算法·深度优先
鱼子星_3 小时前
【C++】深入剖析list:list及其双向迭代器实现
开发语言·数据结构·c++·笔记·stl·list
江屿风4 小时前
【C++笔记】【二叉搜索树】流食般投喂
开发语言·数据结构·c++·笔记
小蒋学算法13 小时前
算法-M个非重叠子数组最大和II-WQS二分学习
数据结构·学习·算法
天天有money17 小时前
API中转站在社媒矩阵里的价值:多平台文案如何统一改写
gpt·线性代数·ai·chatgpt·矩阵
神明不懂浪漫19 小时前
【第三章】链表
开发语言·数据结构·经验分享·笔记·链表
妍妍爱学习21 小时前
Matlab程序蚁群算法.doc
matlab·蚁群算法·路径规划·算法实现·动态寻路