5. 数组运算与矩阵运算
在MATLAB中,术语矩阵和数组在一般情况下是没有区别的。严格地说,一个矩阵就是一个二维的数组,是用来进行线性代数运算的。MATLAB运用于矩阵上的数学运算符是以线性代数中的矩阵运算法则来进行计算的,而数组运算是基于两个矩阵对应元素之间的,所以在MATLAB中,数组运算和矩阵运算是有区别的。
为了更清晰地表述数组运算和矩阵运算的区别,本节将二者相对应的命令列表进行对比,以说明其异同。表2-8列出了两种运算指令形式和实质功能的区别。
表2-8 数组运算与矩阵运算的区别
数组运算 | 矩阵运算 | ||
指 令 | 说 明 | 指 令 | 说 明 |
A.' | 非共轭转置,相当于(conj(A')) | A' | 共轭转置 |
A+B与A-B | 对应元素之间加减 | A+B或A-B | 对应元素之间加减 |
k.*A或A.*k | k乘A的每个元素 | k*A或A*k | k乘A的每个元素 |
k+A与k-A | k加(减)A的每个元素 | k+A与k-A | k加(减)A的每个元素 |
A.*B | 两数组对应元素相乘 | A*B | 按线性代数的矩阵乘法规则 |
A.^k | A的每个元素进行k次方运算 | A^k | k个矩阵A相乘 |
k.^A | 以k为底,分别以A的元素为指数求幂值 | k^A | 矩阵的幂。K和A不能同时为矩阵。按照矩阵幂的运算法则进行计算 |
k./A和A.\k | k分别被A的元素除 | ||
左除A./B | A的元素被B的对应元素除 | 左除A\B | AX=B的解 |
右除B.\A | 与上式结果相同 | 右除B/A | XA=B的解 |
说明:k为标量,即单个数值,A和B均为矩阵或者数组 |
【例2-11】 数组运算和矩阵运算的比较。
>> A=[1 2;3 4]; % 测试矩阵A
>> B=[4 3;2 1]; % 测试矩阵B
>> r1=100+A % 矩阵A加上一个常数
r1 =
101 102
103 104
>> r2_1=A*B % 两个矩阵相乘,矩阵乘法
r2_1 =
8 5
20 13
>> r2_2=A.*B % 两个矩阵相乘,数组乘法
r2_2 =
4 6
6 4
>> r3_1=A\B % 矩阵左除
r3_1 =
-6.0000 -5.0000
5.0000 4.0000
>> r3_2=A.\B % 数组除法
r3_2 =
4.0000 1.5000
0.6667 0.2500
>> r4_1=B/A % 矩阵右除
r4_1 =
-3.5000 2.5000
-2.5000 1.5000
>> r4_2=B./A % 数组除法
r4_2 =
4.0000 1.5000
0.6667 0.2500
>> r5_1=A.^2 % 数组幂
r5_1 =
1 4
9 16
>> r5_2=A^2 % 矩阵幂
r5_2 =
7 10
15 22
>> r6_1=2.^A % 数组幂
r6_1 =
2 4
8 16
6 矩阵的重构
6.1 矩阵元素的扩展与删除
MATLAB提供有对矩阵中的元素进行行或者列的扩展与删除的功能。
1.矩阵元素的扩展
将数据保存在矩阵现有维数以外的元素中时,矩阵的尺寸会自动增加,以便容纳下这个新元素。这个功能可以用来进行矩阵的扩展。
【例2-12】 矩阵的扩展。
>> A=magic(4)
A =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
>> A(6,7)=17
A =
16 2 3 13 0 0 0
5 11 10 8 0 0 0
9 7 6 12 0 0 0
4 14 15 1 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 17
>> A(:,8)=ones(6,1)
A =
16 2 3 13 0 0 0 1
5 11 10 8 0 0 0 1
9 7 6 12 0 0 0 1
4 14 15 1 0 0 0 1
0 0 0 0 0 0 0 1
0 0 0 0 0 0 17 1
本例中,A的原始矩阵并没有A(6,7)这个元素,通过赋值给A(6,7),矩阵A扩展成了一个6´7的新矩阵,其中未赋值的扩展部分以0来填充。另外本例还说明了如何对矩阵的多个元素进行扩展赋值,直接将一个列向量赋值给了扩展部分。
2.矩阵元素的删除
通过将行或列指定为空矩阵[],即可从矩阵中删除行和列。
【例2-13】 矩阵的删除。
>> A=magic(4)
A =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
>> A(:,1)=[] % 删除矩阵A的第1列
A =
2 3 13
11 10 8
7 6 12
14 15 1
>> A(2,:)=[] % 删除矩阵A的第2行
A =
2 3 13
7 6 12
14 15 1
6.2 矩阵的重构
用户可以通过矩阵旋转,改变维数和截取部分元素来产生所需要的新矩阵。MATLAB提供了一些矩阵重构函数,如表2-9所示。
表2-9 常用的矩阵重构函数及说明
函数形式 | 函数功能 | 函数形式 | 函数功能 |
B=rot90(A) | 矩阵B由矩阵A逆时针旋转90°所得 | L=tril(A,k) | L矩阵第k条对角线及以下的元素取矩阵A的元素,其余为0 |
B=rot90(A,K) | 矩阵B由矩阵A逆时针旋转k×90°所得 | L=tril(A) | L矩阵主对角线及以下的元素取矩阵A的元素,其余为0 |
B=flipud(A) | 矩阵B由矩阵A上下翻转所得 | U=triu(A,K) | U矩阵第k条对角线及以上的元素取矩阵A的元素,其余为0 |
B=reshape(A,m,n) | 将矩阵A改写为矩阵B,矩阵B的维数为(m×n),m×n等于矩阵A的元素总个数 | U=triu(A) | U矩阵主对角线及以上的元素取矩阵A的元素,其余为0 |
B=fliplr(A) | 矩阵B由矩阵A左右翻转所得 | 说明:A、B、L、U均为矩阵 |
【例2-14】 矩阵的重构示例。
>> a=reshape(1:9,3,3) % 创建测试矩阵
>> a= [1,7;2,8;3,9;4,10;5,11;6,12] % 创建测试矩阵
a =
1 7
2 8
3 9
4 10
5 11
6 12
>> a = reshape(a,4,3) % 使用reshape改变a的形状,
% 注意前后两个a每一个单下标对应的元素是一致的
a =
1 5 9
2 6 10
3 7 11
4 8 12
>> b=rot90(a,3) % 将矩阵a逆时针旋转3×90°
b =
4 3 2 1
8 7 6 5
12 11 10 9>> c=fliplr(a) % 将矩阵a左右翻转
c =
9 5 1
10 6 2
11 7 3
12 8 4>> d=flipud(a) % 将矩阵a上下翻转
d =
4 8 12
3 7 11
2 6 10
1 5 9【例2-15】 矩阵部分元素的提取。
>> a=[1 2 3;4 5 6; 7 8 9] % 创建测试矩阵
a =
1 2 3
4 5 6
7 8 9
>> b=diag(a) % 求a的对角矩阵
b =
1
5
9
>> c=triu(a,1) % c矩阵第1条对角线及以上的元素取矩阵a的元素,其余为0
c =
0 2 3
0 0 6
0 0 0
>> d=triu(a,2) % d矩阵第2条对角线及以上的元素取矩阵a的元素,其余为0
d =
0 0 3
0 0 0
0 0 0
>> e=triu(a,-1) % e矩阵中除了第3行第1列元素为0,其余元素都取自矩阵a的元素
e =
1 2 3
4 5 6
0 8 9
>> f=tril(a,-1) % 下三角矩阵的提取
f =
0 0 0
4 0 0
7 8 0
