向量和矩阵是 MATLAB 中最核心、最基本的数据结构。MATLAB 的名称本身就源自 “矩阵实验室”(Matrix Laboratory)。掌握向量和矩阵的操作,是精通 MATLAB 编程的第一步,也是最重要的一步。
🧱 创建矩阵
📝 直接创建矩阵
矩阵是数字的二维数组。创建矩阵时,按行输入元素,同一行内的元素用空格或逗号分隔,不同行之间用分号分隔。
1
2
| m = [1 2 3; 4 5 6; 7 8 9] % 同行使用空格分隔
m = [1, 2, 3; 4, 5, 6; 7, 8, 9] % 同行使用逗号分隔
|
💻 运行结果
1
2
3
4
5
6
7
8
9
10
11
| >> 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) |
1
2
3
4
5
6
7
| 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的幻方矩阵
|
💻 运行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| >> 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列的元素。
1
2
3
4
5
6
7
| 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列的子矩阵
|
💻 运行结果
1
2
3
4
5
6
7
8
| >> 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列的所有元素。
1
2
3
4
5
| 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列的子矩阵
|
💻 运行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| >> 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行
1
2
3
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行
|
💻 运行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| >> 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 |
1
2
3
4
5
6
| 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
|
💻 运行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| >> 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)。标量运算产生一个行数和列数相同的新矩阵,原始矩阵中的每个元素都与这个数相加、相减、相乘或相除。
1
2
3
4
5
| A = [1 2; 3 4]; b = 2;
A + b
A - b
A * b
A / b
|
💻 运行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| >> 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 |
1
2
3
4
| A = [1 2; 3 4]; B = [1 4; 3 2];
A .* B % 对应元素相乘
A ./ B % 对应元素相除
A .^ 2 % 每个元素平方
|
💻 运行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| >> 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.' 则不改变矩阵的元素值,只是将行和列交换。
1
2
3
4
5
6
| A = [1 2; 3 4];
B = [1+1i, 1-i; 2+1i, 2-i];
A' % 共轭转置
A.' % 非共轭转置
B' % 共轭转置
B.' % 非共轭转置
|
💻 运行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| >> 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 允许两种类型的串联:
| 类型 | 分隔符 | 说明 |
|---|
| 水平串联 | 逗号 , | 将矩阵水平附加 |
| 垂直串联 | 分号 ; | 将矩阵垂直附加 |
1
2
3
| A = [1 2; 3 4]; B = [1 4; 3 2];
[A, B] % 水平连接
[A; B] % 垂直连接
|
💻 运行结果
1
2
3
4
5
6
7
8
9
10
11
12
| >> 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 |
1
2
3
4
5
6
7
8
9
10
| 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 对应元素相加:
1
2
3
4
5
| 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]
|
1
2
3
4
5
6
| 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
|
💻 运行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| >> 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 中矩阵运算的优先级与常规数学运算一致,但有几个特殊规则需要牢记:
| 优先级 | 运算符 | 说明 |
|---|
| 最高 | () | 圆括号,最优先计算 |
| 高 | ' .' | 转置运算符 |
| 中高 | ^ .^ | 幂运算 |
| 中 | * .* / ./ \ .\ | 乘除运算 |
| 低 | + - | 加减运算 |
| 最低 | : | 冒号运算符 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| % 优先级示例
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
|
💻 运行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| >> 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 检查维度是否匹配 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| % ❌ 常见错误示例
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.' % 非共轭转置:仅转置,不取共轭
|
💻 运行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| >> 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 函数计算矩阵的逆矩阵。
⚠️ 警告:只有方阵才能计算行列式和逆矩阵。只有当矩阵的行列式不为零时,才能计算逆矩阵。
1
2
3
4
5
6
| 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) % 逆矩阵
|
💻 运行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| >> 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) |
1
2
3
4
5
| A = [1 2 3; 4 5 6; 7 8 10];
rank(A) % 矩阵的秩
trace(A) % 矩阵的迹(对角线元素之和)
norm(A) % 矩阵的2-范数
cond(A) % 矩阵的条件数
|
💻 运行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| >> 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 函数轻松求解。
1
2
3
| A = [1 2; 3 4];
[V, D] = eig(A) % V 是特征向量矩阵,D 是特征值对角矩阵
eigenvalues = diag(D) % 提取特征值
|
💻 运行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| >> 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 提供了多种求解方式。
1
2
3
4
5
6
7
8
9
| % 求解方程组:
% 3x + 2y = 5
% x + 2y = 3
A = [3 2; 1 2];
b = [5; 3];
x = A \ b % 使用左除求解 Ax = b(推荐方式)
x_inv = inv(A) * b % 使用逆矩阵求解(效率较低)
|
💻 运行结果
1
2
3
4
5
6
7
8
9
10
11
| >> 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 支持使用逻辑数组对向量和矩阵进行索引,这是一种非常强大且简洁的数据筛选方式。
1
2
3
4
5
6
7
8
9
10
| 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) % 返回满足条件的行列坐标
|
💻 运行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| >> 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
|