文章

MATLAB 向量与矩阵二:矩阵

🧮 向量和矩阵

向量和矩阵是 MATLAB 中最核心、最基本的数据结构。MATLAB 的名称本身就源自 “矩阵实验室”(Matrix Laboratory),这充分体现了矩阵运算在该语言中的基石地位。在 MATLAB 中,所有的数值数据本质上都可以被视为矩阵——标量是 1×1 的矩阵,向量是 1×nn×1 的矩阵,而二维数组则是我们通常所说的矩阵。这种统一的数据结构设计使得 MATLAB 在处理线性代数、数值计算、信号处理、图像处理、机器学习以及工程仿真等领域的问题时,能够以极其简洁和高效的语法进行表达。无论是求解线性方程组、进行特征值分解,还是处理大规模数据集,向量和矩阵的运算都是 MATLAB 强大计算能力的核心所在。掌握向量和矩阵的操作,是精通 MATLAB 编程的第一步,也是最重要的一步。


📑 目录

快速导航到各小节内容:

#章节内容简介
1🧱 创建矩阵二维数组的创建方法
 🏗️ 生成特殊矩阵oneszeroseyerand
2🎯 引用矩阵的元素行列索引与子矩阵提取
3➕ 矩阵运算加减乘除与左除右除
4🔢 矩阵的标量运算矩阵与标量的四则运算
 🔲 元素级运算.*./.^ 点运算符
5🔄 矩阵的转置共轭转置与非共轭转置
6🔗 矩阵连接水平串联与垂直串联
7📊 矩阵的行列式和逆矩阵detinvA^(-1)
8📈 矩阵的秩、迹与范数ranktracenormcond
9🔑 特征值与特征向量eig 函数求解
10📡 隐式扩展(广播机制)R2016b+ 自动维度扩展
11🔍 逻辑索引与 find 函数逻辑数组筛选与 find 定位
12📝 线性方程组求解左除 \inv 对比
13🧊 多维数组三维及以上数组的创建

🧱 创建矩阵

矩阵是数字的二维数组。创建矩阵时,按行输入元素,同一行内的元素用空格或逗号分隔,不同行之间用分号分隔。

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

本文由作者按照 CC BY 4.0 进行授权