向量和矩阵是 MATLAB 中最核心、最基本的数据结构。MATLAB 的名称本身就源自 "矩阵实验室"(Matrix Laboratory)。掌握向量和矩阵的操作,是精通 MATLAB 编程的第一步,也是最重要的一步。
🧱 创建矩阵
📝 直接创建矩阵
矩阵是数字的二维数组。创建矩阵时,按行输入元素,同一行内的元素用空格或逗号分隔,不同行之间用分号分隔。
m = [1 2 3; 4 5 6; 7 8 9] % 同行使用空格分隔
m = [1, 2, 3; 4, 5, 6; 7, 8, 9] % 同行使用逗号分隔
💻 运行结果
>> m = [1 2 3; 4 5 6; 7 8 9] m = 1 2 3 4 5 6 7 8 9 >> m = [1, 2, 3; 4, 5, 6; 7, 8, 9] m = 1 2 3 4 5 6 7 8 9
🏗️ 生成特殊矩阵
| 函数 | 说明 | 示例 |
|---|---|---|
ones | 全 1 矩阵 | ones(3, 3) |
zeros | 全 0 矩阵 | zeros(3, 3) |
eye | 单位矩阵 | eye(3) |
rand | [0,1] 均匀分布随机矩阵 | rand(3, 3) |
randn | 标准正态分布随机矩阵 | randn(3, 3) |
diag | 对角矩阵 | diag([1,2,3]) |
magic | 幻方矩阵 | magic(3) |
a = ones(3, 3) % 全是1的矩阵
b = zeros(3, 3) % 全是0的矩阵
c = eye(3) % 单位矩阵
R = rand(3, 3) % 生成[0,1]区间的随机数矩阵
RN = randn(3, 3) % 均值为0,方差为1的随机数矩阵
diagM = diag([1,2,3]) % 生成对角线为[1,2,3]的矩阵
M = magic(3) % 生成3x3的幻方矩阵
💻 运行结果
>> a = ones(3, 3) a = 1 1 1 1 1 1 1 1 1 >> b = zeros(3, 3) b = 0 0 0 0 0 0 0 0 0 >> c = eye(3) c = 1 0 0 0 1 0 0 0 1 >> R = rand(3, 3) R = 0.8147 0.9134 0.2785 0.9058 0.6324 0.5469 0.1270 0.0975 0.9575 >> RN = randn(3, 3) RN = -0.4326 0.2877 1.1892 -1.6656 -1.1465 -0.0376 0.1253 1.1909 0.3273 >> diagM = diag([1,2,3]) diagM = 1 0 0 0 2 0 0 0 3 >> M = magic(3) M = 8 1 6 3 5 7 4 9 2
🎯 引用矩阵的元素
🔍 行列索引
引用矩阵的元素时,使用括号 () 来指定行索引和列索引。例如,a(2, 5) 表示引用矩阵 a 的第2行第5列的元素。
a = [1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
a(2, 5) % 第2行第5列
a(2, :) % 第2行所有元素
a(:, 4) % 第4列所有元素
a(:, 4:5) % 第4到第5列所有元素
sa = a(2:3, 2:4) % 第2-3行,第2-4列的子矩阵
💻 运行结果
>> a = [1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8]; >> a(2, 5) ans = 6 >> a(2, 3) ans = 4
🔗 块索引
获取子矩阵的元素时,使用方括号 (:,:) 来指定行索引和列索引的范围。例如,a(2:3, 2:4) 表示引用矩阵 a 的第2-3行,第2-4列的子矩阵。如果提取整行,列索引可以省略,只使用“:号”:如a(2:3, :) 表示引用矩阵 a 的第2-3行的所有元素。提取整列时,行索引可以省略,只使用“:号”,如a(:, 4) 表示引用矩阵 a 的第4列的所有元素。
a = [1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
a(2, :) % 第2行所有元素
a(:, 4) % 第4列所有元素
a(:, 4:5) % 第4到第5列所有元素
sa = a(2:3, 2:4) % 第2-3行,第2-4列的子矩阵
💻 运行结果
>> a = [1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8]; >> a(2, :) ans = 2 3 4 5 6 >> a(:, 4) ans = 4 5 6 7 >> a(:, 4:5) ans = 4 5 5 6 6 7 7 8 >> sa = a(2:3, 2:4) sa = 3 4 5 4 5 6
✏️ 修改矩阵元素
修改矩阵的元素时,只需要指定要修改的元素的行索引和列索引,即可修改该元素的值。例如,a(2, 5) = 100 表示将矩阵 a 的第2行第5列的元素修改为100。如果需要删除矩阵的一行或一列,可以使用空矩阵 [] 来赋值。例如,a(4, :) = [] 表示删除第 a 的第4行
a = [1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
a(2, 5) = 100
% 删除行或列
a(4, :) = [] % 删除第4行
💻 运行结果
>> a = [1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8]; >> a(2, 5) = 100 a = 1 2 3 4 5 2 3 4 5 100 3 4 5 6 7 4 5 6 7 8 >> a(4, :) = [] a = 1 2 3 4 5 2 3 4 5 100 3 4 5 6 7
➕ 矩阵运算
MATLAB 提供了丰富的矩阵运算操作,涵盖了从基础算术到线性代数的各种运算:
| 运算类型 | 运算符 | 说明 | 示例 |
|---|---|---|---|
| 加法 | + | 对应元素相加 | A + B |
| 减法 | - | 对应元素相减 | A - B |
| 乘法 | * | 矩阵乘法(线性代数规则) | A * B |
| 右除 | / | A/B = A*B^(-1) | A / B |
| 左除 | \ | A\B = A^(-1)*B | A \ B |
A = [1 2; 3 4]; B = [1 4; 3 2];
A + B % 矩阵的加法
A - B % 矩阵的减法
A * B % 矩阵的乘法
A / B % 右除 A/B = A*B^(-1)
A \ B % 左除 A\B = A^(-1)*B
💻 运行结果
>> A = [1 2; 3 4]; B = [1 4; 3 2]; >> A + B ans = 2 6 6 6 >> A - B ans = 0 -2 0 2 >> A * B ans = 7 8 15 20 >> A / B ans = 1.0000 0 0.5000 1.0000 >> A \ B ans = 5.0000 -4.0000 -2.0000 3.0000
🔢 矩阵的标量运算
当您将一个矩阵加、减、乘或除以一个数字时,这称为 标量运算(Scalar Operation)。标量运算产生一个行数和列数相同的新矩阵,原始矩阵中的每个元素都与这个数相加、相减、相乘或相除。
A = [1 2; 3 4]; b = 2;
A + b
A - b
A * b
A / b
💻 运行结果
>> A = [1 2; 3 4]; b = 2; >> A + b ans = 3 4 5 6 >> A - b ans = -1 0 1 2 >> A * b ans = 2 4 6 8 >> A / b ans = 0.5000 1.0000 1.5000 2.0000
🔲 元素级运算(Element-wise Operations)
矩阵运算和元素级运算是 MATLAB 初学者最容易混淆的概念之一。矩阵运算遵循线性代数的规则,而元素级运算则是对矩阵中的每个对应元素分别进行操作,使用点号 . 前缀来标识。
| 运算符 | 说明 | 示例 |
|---|---|---|
.* | 对应元素相乘 | A .* B |
./ | 对应元素右除 | A ./ B |
.\ | 对应元素左除 | A .\ B |
.^ | 每个元素求幂 | A .^ 2 |
A = [1 2; 3 4]; B = [1 4; 3 2];
A .* B % 对应元素相乘
A ./ B % 对应元素相除
A .^ 2 % 每个元素平方
💻 运行结果
>> A = [1 2; 3 4]; B = [1 4; 3 2]; >> A .* B ans = 1 8 9 8 >> A ./ B ans = 1.0000 0.5000 1.0000 2.0000 >> A .^ 2 ans = 1 4 9 16
🔄 矩阵的转置
矩阵的转置是指将矩阵的行和列交换,得到一个新的矩阵。例如,矩阵 A 的转置为 A',其中 A' 表示 A 的共轭转置。非共轭转置 A.' 则不改变矩阵的元素值,只是将行和列交换。
A = [1 2; 3 4];
B = [1+1i, 1-i; 2+1i, 2-i];
A' % 共轭转置
A.' % 非共轭转置
B' % 共轭转置
B.' % 非共轭转置
💻 运行结果
>> A = [1 2; 3 4]; B = [1+1i, 1-i; 2+1i, 2-i]; >> A' ans = 1 3 2 4 >> A.' ans = 1 3 2 4 >> B' ans = 1.0000 - 1.0000i 2.0000 - 1.0000i 1.0000 + 1.0000i 2.0000 + 1.0000i >> B.' ans = 1.0000 + 1.0000i 2.0000 + 1.0000i 1.0000 - 1.0000i 2.0000 - 1.0000i
🔗 矩阵连接
您可以连接两个矩阵以创建更大的矩阵。方括号 [] 是串联运算符。
MATLAB 允许两种类型的串联:
| 类型 | 分隔符 | 说明 |
|---|---|---|
| 水平串联 | 逗号 , | 将矩阵水平附加 |
| 垂直串联 | 分号 ; | 将矩阵垂直附加 |
A = [1 2; 3 4]; B = [1 4; 3 2];
[A, B] % 水平连接
[A; B] % 垂直连接
💻 运行结果
>> A = [1 2; 3 4]; B = [1 4; 3 2]; >> [A, B] ans = 1 2 1 4 3 4 3 2 >> [A; B] ans = 1 2 3 4 1 4 3 2
📡 隐式扩展(广播机制)
从 MATLAB R2016b 开始,引入了**隐式扩展(Implicit Expansion)**机制,允许不同大小的数组在运算时自动扩展以匹配维度。这在向量与矩阵的运算中非常实用。
隐式扩展遵循以下规则:当两个数组进行运算时,如果它们的维度不匹配,MATLAB 会自动将维度为 1 的数组沿该维度扩展,以匹配另一个数组的维度。具体规则如下:
| 规则 | 说明 | 示例 |
|---|---|---|
| 标量扩展 | 标量(1×1)自动扩展为与另一个数组相同的维度 | A + 2 |
| 行向量扩展 | 1×n 行向量沿行方向(向下)复制,即把同一行重复 m 次,扩展为 m×n 矩阵 | M + w(w 为 1×3) |
| 列向量扩展 | m×1 列向量沿列方向(向右)复制,即把同一列重复 n 次,扩展为 m×n 矩阵 | v + M(v 为 3×1) |
| 维度匹配要求 | 除维度为 1 的维度外,其余维度必须相等,否则报错 | [1 2 3] + [1 2] 会报错 |
| 适用运算 | 适用于 +、-、.*、./、.^、比较运算等元素级运算 | v .* M、v > 5 |
v = [1; 2; 3] M = [10 20 30; 40 50 60; 70 80 90]
3×1 列向量 3×3 矩阵
v 沿列方向复制 3 次,扩展为 3×3:
v 扩展后 = [1 1 1; 2 2 2; 3 3 3]
然后对应元素相加:
[1 1 1] [10 20 30] [11 21 31]
[2 2 2] + [40 50 60] = [42 52 62]
[3 3 3] [70 80 90] [73 83 93]
同理,M + w 中 w = [100 200 300] 沿行方向复制 3 次,扩展为 3×3 后与 M 对应元素相加:
w 扩展后 = [100 200 300; 100 200 300; 100 200 300]
[10 20 30] [100 200 300] [110 220 330]
[40 50 60] + [100 200 300] = [140 250 360]
[70 80 90] [100 200 300] [170 280 390]
v = [1; 2; 3]; % 3×1 列向量
M = [10 20 30; 40 50 60; 70 80 90]; % 3×3 矩阵
v + M % 自动广播:v 扩展为 3×3
w = [100 200 300]; % 1×3 行向量
M + w % 自动广播:w 扩展为 3×3
💻 运行结果
>> v = [1; 2; 3]; >> M = [10 20 30; 40 50 60; 70 80 90]; >> v + M ans = 11 21 31 42 52 62 73 83 93 >> w = [100 200 300]; >> M + w ans = 110 220 330 140 250 360 170 280 390
🔢 矩阵运算的优先级
MATLAB 中矩阵运算的优先级与常规数学运算一致,但有几个特殊规则需要牢记:
| 优先级 | 运算符 | 说明 |
|---|---|---|
| 最高 | () | 圆括号,最优先计算 |
| 高 | ' .' | 转置运算符 |
| 中高 | ^ .^ | 幂运算 |
| 中 | * .* / ./ \ .\ | 乘除运算 |
| 低 | + - | 加减运算 |
| 最低 | : | 冒号运算符 |
% 优先级示例
A = [1 2; 3 4]; B = [1 4; 3 2];
% 转置优先级高于算术运算
A + B' % 先转置 B,再相加
(A + B)' % 先相加,再转置
% 幂运算优先级高于乘除
2 * A.^2 % 先计算 A.^2,再乘以 2
(2 * A).^2 % 先乘以 2,再平方
% 矩阵乘法优先级高于加减
A * B + A % 先计算 A*B,再加 A
A * (B + A) % 先计算 B+A,再乘 A
💻 运行结果
>> A = [1 2; 3 4]; B = [1 4; 3 2]; >> A + B' ans = 2 5 6 6 >> (A + B)' ans = 2 6 6 6 >> 2 * A.^2 ans = 2 8 18 32 >> (2 * A).^2 ans = 4 16 36 64 >> A * B + A ans = 8 10 18 24 >> A * (B + A) ans = 8 14 18 32
💡 提示:当不确定优先级时,使用圆括号
()明确指定计算顺序,既避免错误,也提高代码可读性。
⚠️ 矩阵运算的注意事项
在使用 MATLAB 进行矩阵运算时,有几个容易混淆的细节需要特别注意:
| 注意事项 | 说明 | 正确做法 |
|---|---|---|
| 矩阵乘法 vs 元素乘法 | A * B 是矩阵乘法,遵循线性代数规则;A .* B 才是对应元素相乘 | 元素级运算需使用点运算符 .* |
| 转置运算符 | ' 是共轭转置,.' 是非共轭转置 | 实数矩阵两者等价,复数矩阵需区分 |
| 左除与右除 | A \ B 是左除(A^(-1)*B),A / B 是右除(A*B^(-1)) | 求解 Ax = b 用左除 A \ b |
| 维度一致性 | 矩阵加减要求维度完全相同;矩阵乘法要求 A 的列数等于 B 的行数 | 运算前用 size 检查维度是否匹配 |
| 矩阵拼接 | 水平拼接 [A, B] 要求行数相同;垂直拼接 [A; B] 要求列数相同 | 拼接前用 size 检查维度是否匹配 |
% ❌ 常见错误示例
A = [1 2 3; 4 5 6]; B = [1 2; 3 4];
% A * B % 错误!A 的列数(3)不等于 B 的行数(2)
% ❌ 矩阵加减维度不匹配
X = [1 2 3]; Y = [4 5];
% X + Y % 错误!维度不同,无法相加
% ✅ 正确做法
A = [1 2; 3 4]; B = [1 4; 3 2];
A * B % 矩阵乘法(线性代数规则)
A .* B % 元素级乘法
A \ B % 左除
A / B % 右除
% ✅ 运算前检查维度
size(A) % 查看维度
size(B) % 查看维度
% 复数转置的区分
C = [1+2i, 3+4i; 5+6i, 7+8i];
C' % 共轭转置:元素取共轭
C.' % 非共轭转置:仅转置,不取共轭
💻 运行结果
>> A = [1 2; 3 4]; B = [1 4; 3 2]; >> A * B ans = 7 8 15 20 >> A .* B ans = 1 8 9 8 >> A \ B ans = 1 -6 0 5 >> A / B ans = 0.4 0.2 0.6 0.8 >> C = [1+2i, 3+4i; 5+6i, 7+8i]; >> C' ans = 1.0000 - 2.0000i 5.0000 - 6.0000i 3.0000 - 4.0000i 7.0000 - 8.0000i >> C.' ans = 1.0000 + 2.0000i 5.0000 + 6.0000i 3.0000 + 4.0000i 7.0000 + 8.0000i
📊 矩阵与线性代数
🧮 矩阵的行列式和逆矩阵
使用 det 函数计算矩阵的行列式,使用 inv 函数计算矩阵的逆矩阵。
⚠️ 警告:只有方阵才能计算行列式和逆矩阵。只有当矩阵的行列式不为零时,才能计算逆矩阵。
a = [1 2 3; 2 3 4; 1 2 5];
det(a) % 行列式
A = [1 2 3; 2 3 4; 1 2 5];
A^(-1) % 逆矩阵
inv(A) % 逆矩阵
💻 运行结果
>> a = [1 2 3; 2 3 4; 1 2 5]; >> det(a) ans = -2 >> A = [1 2 3; 2 3 4; 1 2 5]; >> A^(-1) ans = -3.5000 2.0000 0.5000 3.0000 -1.0000 -1.0000 -0.5000 0 0.5000 >> inv(A) ans = -3.5000 2.0000 0.5000 3.0000 -1.0000 -1.0000 -0.5000 0 0.5000
📈 矩阵的秩、迹与范数
MATLAB 提供了丰富的线性代数函数来获取矩阵的各种属性:
| 函数 | 说明 | 示例 |
|---|---|---|
rank | 矩阵的秩 | rank(A) |
trace | 矩阵的迹(对角线元素之和) | trace(A) |
norm | 矩阵或向量的范数 | norm(A) |
cond | 矩阵的条件数 | cond(A) |
A = [1 2 3; 4 5 6; 7 8 10];
rank(A) % 矩阵的秩
trace(A) % 矩阵的迹(对角线元素之和)
norm(A) % 矩阵的2-范数
cond(A) % 矩阵的条件数
💻 运行结果
>> A = [1 2 3; 4 5 6; 7 8 10]; >> rank(A) ans = 3 >> trace(A) ans = 16 >> norm(A) ans = 17.4125 >> cond(A) ans = 50.7197
🔑 特征值与特征向量
特征值和特征向量是线性代数中的核心概念,在 MATLAB 中可以使用 eig 函数轻松求解。
A = [1 2; 3 4];
[V, D] = eig(A) % V 是特征向量矩阵,D 是特征值对角矩阵
eigenvalues = diag(D) % 提取特征值
💻 运行结果
>> A = [1 2; 3 4]; >> [V, D] = eig(A) V = -0.8246 -0.4160 0.5658 -0.9094 D = -0.3723 0 0 5.3723 >> eigenvalues = diag(D) eigenvalues = -0.3723 5.3723
📝 线性方程组求解
求解线性方程组是 MATLAB 最强大的功能之一。对于方程组 Ax = b,MATLAB 提供了多种求解方式。
% 求解方程组:
% 3x + 2y = 5
% x + 2y = 3
A = [3 2; 1 2];
b = [5; 3];
x = A \ b % 使用左除求解 Ax = b(推荐方式)
x_inv = inv(A) * b % 使用逆矩阵求解(效率较低)
💻 运行结果
>> A = [3 2; 1 2]; >> b = [5; 3]; >> x = A \ b x = 1.0000 1.0000 >> x_inv = inv(A) * b x_inv = 1.0000 1.0000
💡 提示:在实际工程中,推荐使用左除运算符
\而非inv(A) * b来求解线性方程组。左除运算在数值上更稳定,计算效率更高,且能自动选择最适合的求解算法(如 LU 分解、Cholesky 分解等)。
🔍 逻辑索引与 find 函数
MATLAB 支持使用逻辑数组对向量和矩阵进行索引,这是一种非常强大且简洁的数据筛选方式。
a = [1 5 3 8 2 7 4];
a > 3 % 逻辑索引,返回逻辑数组
a(a > 3) % 筛选出所有大于3的元素
find(a > 3) % 返回满足条件的元素位置(索引)
% 矩阵中的逻辑索引
M = [1 2 3; 4 5 6; 7 8 9];
M(M > 5) % 筛选出矩阵中所有大于5的元素
[row, col] = find(M > 5) % 返回满足条件的行列坐标
💻 运行结果
>> a = [1 5 3 8 2 7 4]; >> a > 3 ans = 1×7 logical 数组 0 1 0 1 0 1 1 >> a(a > 3) ans = 5 8 7 4 >> find(a > 3) ans = 2 4 6 7 >> M = [1 2 3; 4 5 6; 7 8 9]; >> M(M > 5) ans = 7 8 6 9 >> [row, col] = find(M > 5) row = 3 3 2 3 col = 1 2 3 3
作者 majorArcs 原文链接:k-hengzhou.github.io/posts/MATLA…