MATLAB 向量与矩阵二:矩阵

0 阅读14分钟

向量和矩阵是 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)*BA \ 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 + ww1×3
列向量扩展m×1 列向量沿列方向(向右)复制,即把同一列重复 n 次,扩展为 m×n 矩阵v + Mv3×1
维度匹配要求除维度为 1 的维度外,其余维度必须相等,否则报错[1 2 3] + [1 2] 会报错
适用运算适用于 +-.*./.^、比较运算等元素级运算v .* Mv > 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 + ww = [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…