🧮 向量和矩阵
向量和矩阵是 MATLAB 中最核心、最基本的数据结构。MATLAB 的名称本身就源自 “矩阵实验室”(Matrix Laboratory),这充分体现了矩阵运算在该语言中的基石地位。在 MATLAB 中,所有的数值数据本质上都可以被视为矩阵——标量是 1×1 的矩阵,向量是 1×n 或 n×1 的矩阵,而二维数组则是我们通常所说的矩阵。这种统一的数据结构设计使得 MATLAB 在处理线性代数、数值计算、信号处理、图像处理、机器学习以及工程仿真等领域的问题时,能够以极其简洁和高效的语法进行表达。无论是求解线性方程组、进行特征值分解,还是处理大规模数据集,向量和矩阵的运算都是 MATLAB 强大计算能力的核心所在。掌握向量和矩阵的操作,是精通 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
8
9
| 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(4, :) = [] % 删除第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
26
27
28
29
30
31
32
33
| >> 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, :)
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(4, :) = []
a =
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
|
➕ 矩阵运算
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
|
🔄 矩阵的转置
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
|
📊 矩阵的行列式和逆矩阵
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 R2016b 开始,引入了隐式扩展(Implicit Expansion)机制,允许不同大小的数组在运算时自动扩展以匹配维度。这在向量与矩阵的运算中非常实用。
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
|
🔍 逻辑索引与 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
|
📝 线性方程组求解
求解线性方程组是 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 分解等)。
🧊 多维数组
具有两个以上维的数组在 MATLAB 中称为多维数组。
1
2
| format short
b = rand(4, 3, 2) % 4x3x2的三维数组
|
💻 运行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
| >> format short
>> b = rand(4, 3, 2)
b(:,:,1) =
0.9575 0.9572 0.8003
0.9649 0.4854 0.1419
0.1576 0.8003 0.4218
0.9706 0.1419 0.9157
b(:,:,2) =
0.7922 0.0357 0.6787
0.9595 0.8491 0.7577
0.6557 0.9340 0.7431
0.0357 0.6787 0.3922
|