2.5 矩阵的基本运算
矩阵的基本运算是线性代数的基础。本节先介绍一些复数矩阵的变换方法,然后介绍一般矩阵的转置与翻转处理、矩阵的Kronecker和与乘积,最后介绍矩阵的代数运算方法。
2.5.1 复数矩阵的处理
MATLAB可以直接表示复数矩阵。假设已知一个复数矩阵Z,则可以使用简单函数对该矩阵进行如下变换:
(1)共轭复数矩阵,Z1=conj(Z);
(2)实部、虚部提取,R=real(Z),I=imag(Z);
(3)幅值、相位表示,A=abs(Z),P=angle(Z),其中相位的单位为弧度(radian,简记rad)。
其实,这里的Z并不局限于矩阵,还可以是多维数组或符号表达式。
例2-25 考虑下面给出的复数矩阵A,试提取矩阵的实部、虚部与共轭矩阵。
解 可以先输入复数矩阵,然后提取其实部与虚部矩阵。
实部、虚部与共轭复数矩阵分别为
2.5.2 矩阵的转置与旋转
在对矩阵进行处理时,有时需要用到矩阵转置,有的时候可能需要对矩阵进行翻转和旋转处理,这些基本操作在MATLAB下都有现成的处理函数,总结如下。
1)矩阵转置
这里给出两类矩阵转置运算。
定义2-14 假设矩阵A∈Cn×m,则其转置矩阵B的元素定义为bji=aij,i=1,2,…,n,j=1,2,…,m,故B∈Cm×n矩阵,记作B=AT,这种转置又称为直接转置。
定义2-15 如果矩阵A含有复数元素,则对之进行转置时,其转置矩阵B的元素定义为,i=1,2,…,n,j=1,2,…,m,亦即首先对各个元素进行转置,然后再逐项求取其共轭复数值。这种转置方式又称为Hermite转置,记作B=AH。
MATLAB中用B=A'可以求出A矩阵的Hermite转置,矩阵的转置则可以由C=A.'求出。
定义2-16 若复数矩阵等于其共轭转置,即A=AH,则A称为Hermite矩阵。
定义2-17 若复数矩阵A=−AH,则A称反Hermite(skew-Hermitian)矩阵。
定理2-1 复数矩阵A和B乘积的转置满足
(AB)T=BTAT,(AB)H=BHAH
(2-5-1)
例2-26 考虑例2-25中的复数矩阵B,试求其直接转置与Hermite转置。
解 先将矩阵B输入计算机,则可以由下面命令得出两种转置。
得出的Hermite转置与直接转置分别为
2)矩阵翻转
MATLAB提供了一些矩阵翻转处理的特殊命令。例如,矩阵的左右翻转函数B=fliplr(A),将矩阵A进行左右翻转再赋给B,亦即bij=ai,n+1−j。从效果上看,左右翻转函数等效于B=A(:,end:−1:1)。而C=flipud(A)命令将矩阵A进行上下翻转并将结果赋给C,亦即cij=am+1−i,j,矩阵的上下翻转命令等效于C=A(end:−1:1,1)。
矩阵左右翻转的另一种方法是B=A(:,end:−1:1),类似地还可以实现上下翻转,这样做的好处是可以实现矩阵行列的任意排序或局部矩阵排序。
例2-27 已知如下矩阵,试将其各行作一次随机排列。
解 利用randperm(n)函数可以实现1,2,…,n的一次随机排序,利用该排序则可以实现A矩阵各行的随机排序。
得出的随机排序次序向量为[2,1,3],重新排序结果为(每次运行结果可能不同)
3)矩阵的旋转
MATLAB函数D=rot90(A)可以将A矩阵逆时针旋转90°后赋给D,亦即dij=am+1−i,j。函数E=rot90(A,k)还可以逆时针旋转该矩阵90k°后赋给E矩阵,其中k为整数。
例2-28 已知如下的A矩阵,试将其顺时针旋转90°,转成B矩阵的形式。
解 标准的rot90()函数处理的是逆时针旋转的问题。矩阵顺时针旋转90°有两种方法实现,第一种在调用rot90()时令k=−1,另一种是令k=3,即逆时针旋转270°。所以,下面的语句可以直接得出旋转矩阵B1=B2,都是所需的B矩阵。
>> A=[1 2 3; 4 5 6; 7 8 0]; B1=rot90(A,-1), B2=rot90(A,3)
2.5.3 矩阵的代数运算
代数运算是MATLAB科学运算领域很基础的一类运算。本节将给出代数运算的定义,然后介绍基于MATLAB的代数运算实现方法。
定义2-18 变量之间的有限次加、减、乘、除、乘方、开方等运算称为代数运算。
MATLAB语言中定义了下面各种矩阵的基本代数运算:
1)加减法运算
假设在MATLAB工作空间下有两个矩阵A和B,则可以由C=A+B和C=A−B命令执行矩阵加减法。若A、B的维数相同,则自动地将A、B的相应元素相加减,从而得出正确的结果,并赋给C变量。
MATLAB下考虑了两种特殊情况,允许不同维数的矩阵作加减运算。
(1)若二者之一为标量,则应该将其遍加(减)于另一个矩阵。
(2)若A∈Cn×m,B为n×1列向量或1×m行向量,早期版本的MATLAB版本会给出错误信息,而新版本的MATLAB允许将列向量或行向量遍加或遍减到另一个矩阵的各列或各行上去,得出新的和矩阵或差矩阵。
在其他情况下,MATLAB将自动地给出错误信息,提示用户两个矩阵的维数不匹配。
例2-29 观察两个简单的变量如下,它们的和A+B是多少?
解 在数学上这两个矩阵是不可加的,早期版本的MATLAB如果作加法也将得到错误信息,在新发布的MATLAB下可以尝试下面的加减法运算。
>> A=[5;6]; B=[1 2; 3 4]; C=A+B, D=B-A'
实际应用中可以定义出一种有意义的“加法”:因为A是列向量,所以将其遍加到B矩阵的各列上,可以得出“加法矩阵”如下。另外,由于AT为行向量,D矩阵等于B矩阵每行遍减AT向量得出的矩阵。
2)矩阵乘法
与两个矩阵乘法相关的定义如下。
定义2-19 假设有两个矩阵A和B,其中,A矩阵的列数与B矩阵的行数相等,或其一为标量,则称A,B矩阵是可乘的,或称A和B矩阵的维数是相容的。
定义2-20 假设A∈Cn×m,B∈Cm×r,则C=AB∈Cn×r,满足
定义2-21 如果两个矩阵A与B任何一个为标量,则AB等于将这个标量遍乘到另一个矩阵每个元素后的新矩阵。
MATLAB语言中两个矩阵的乘法由C=A*B直接求出,且这里并不需要指定A和B矩阵的维数。若A和B矩阵的维数相容,则可以准确无误地获得乘积矩阵C;如果二者的维数不相容,则将给出错误信息,通知用户两个矩阵不可乘。
例2-30 已知两个矩阵A与B如下,由MATLAB乘法命令可以得出矩阵的积。
解 矩阵乘法是矩阵运算的基础,这里通过底层乘法的方式演示这两个矩阵相乘的结果。该结果与A*B命令的结果是完全一致的。
在MATLAB下还可以尝试A*B'命令,不过该命令将导致错误信息,说明第一个矩阵的列数与第二个矩阵的行数不匹配,二者不能相乘。因为要执行这样的运算,B'的计算优先于乘法运算,从而其转置为2×3矩阵,这样,A乘以该矩阵由于维数不匹配而不能相乘,导致错误信息。
3)向量的内积
向量的内积是一个行向量与一个列向量的乘积,结果为标量。
定义2-22 已知两个等长的列向量a、b,其内积定义为〈a,b〉=aTb。
定理2-2 内积满足下面一些性质。
〈a,b〉=〈b,a〉,〈λa,b〉=λ〈a,b〉,〈a,b+c〉=〈a,b〉+〈a,c〉
(2-5-3)
定理2-3 当且仅当〈a,a〉=0时,a≡0。
如果MATLAB工作空间中有两个向量a、b,其内积可以由c=a(:).'*b(:)求出,即使这两个向量不是列向量也能直接求解。
4)矩阵的左除
MATLAB中用“\”运算符号表示两个矩阵的左除,A\B为方程AX=B的解X。若A为非奇异方阵,则X=A−1B。如果A矩阵不是方阵,也可以求出X=A\B,这时将使用最小二乘解法来求取AX=B中的X矩阵。
5)矩阵的右除
MATLAB中定义了“/”符号,用于表示两个矩阵的右除,相当于求方程XA=B的解。A为非奇异方阵时,B/A为BA−1,但在计算方法上存在差异,更精确地,有B/A=(A'\B')'。
6)矩阵乘方运算
一个矩阵的乘方运算可以在数学上表述成Ax。如果x为正整数,则乘方表达式Ax的结果可以将A矩阵自乘x次得出。如果x为负整数,则可以将A矩阵自乘x次,然后对结果进行求逆运算就可以得出该乘方结果。如果x是一个分数,例如x=n/m,其中n和m均为整数,则相当于将A矩阵自乘n次,然后对结果再开m次方。在MATLAB中统一表示成F=A^x。
7)矩阵开方运算
数学公式上看,矩阵A自乘n次是可以得出唯一解的,而其结果再作m次开方则应该有m个不同的根。考虑,其一个根是−1,对该根在复数平面内旋转120°可以得到第二个根,再旋转120°则可以得出第三个根。怎么实现旋转120°呢?可以将结果乘以复数标量δ=e2πj/3实现。
定理2-4 若A矩阵的一个m次方根矩阵为A0,则其他m次方根为A0e2kπj/m。其中,k=1,2,…,m−1。
使用MATLAB通过的A^(1/m)命令就可以得到矩阵的一个m次方根。
例2-31 考虑下面给出的A矩阵,试求出其全部立方根并检验结果。
解 由乘方运算可以容易地得出原矩阵的一个立方根。
具体表示如下。经检验,误差范数为e=1.0145×10−14,比较精确。
事实上,矩阵的立方根应该有三个结果,而上面只得出其中的一个。对该方根进行两次旋转,即计算Cej2π/3和Cej4π/3,则将得出另外两个根。
这样可以得出另外两个根如下,误差都是10−14级别的。
还可以考虑在符号运算的框架下由变精度算法计算已知矩阵的立方根,精度将达到7.2211×10−39,精度远高于双精度框架下的计算结果。
例2-32 矩阵A的逆矩阵在数学上记作A−1,并可以由inv(A)函数直接计算。试求例2-25的复数矩阵的−1次方,看看是不是等于B矩阵的逆矩阵。
解 为保证计算精度,下面的计算在符号运算框架下实现。
由上面语句可以看出二者是相等的,都是正确的,且与原矩阵的乘积是单位矩阵,这也说明矩阵的逆确实是矩阵的“倒数”。
8)点运算
MATLAB中定义了一种特殊的运算,即所谓的点运算。两个矩阵之间的点运算是它们对应元素的直接运算。例如,C=A.*B表示A和B矩阵的相应元素之间直接进行乘法运算,然后将结果赋给C矩阵,即cij=aijbij。这种点乘积运算又称为Hadamard乘积。注意,点乘积运算要求A和B矩阵的维数相同,或其一为标量。可以看出,这种运算和普通乘法运算是不同的。
点运算在MATLAB中起着很重要的作用。例如,当x是一个向量时,则求取数值时不能直接写成x^5,而必须写成x.^5。在进行矩阵的点运算时,同样要求运算的两个矩阵的维数一致,或其中一个变量为标量。其实一些特殊的函数,如sin()也是由点运算的形式进行的,因为它要对矩阵的每个元素求取正弦值。
矩阵点运算不只可以用于点乘积运算,还可以用于其他运算的场合。
例2-33 对例2-1给出的矩阵A,试求解并理解B=A.^A运算。
解 对前面给出的矩阵A作B=A.^A运算,则新矩阵的第(i,j)个元素为bi,j=,这样可以得出下面的结果。
该语句将计算并生成如下的矩阵的数值解与解析解,分别为
从结果看,与预期一致,得出的结果是由下面矩阵得出的。
2.5.4 矩阵的Kronecker乘积与Kronecker和
Kronecker乘积与Kronecker和是以德国数学家、逻辑学家Leopold Kronecker(1823−1891)命名的运算,在线性方程求解中有着重要的应用。
定义2-23 两个矩阵A与B,其Kronecker乘积定义为
定义2-24 矩阵A与B的Kronecker和A⊕B的数学定义为
定理2-5 若矩阵A与B维数相同,则Kronecker乘积满足分配律
定理2-6 Kronecker乘积的转置为
(A⊗B)T=BT⊗AT
(2-5-7)
定理2-7 Kronecker乘积的结合律为
A(B⊗C)=(A⊗B)C
(2-5-8)
定理2-8 如果下面参与乘积的矩阵维数相容,则
(A⊗B)(C⊗D)=(AC)⊗(BD)
(2-5-9)
上面几个定理中,如果⊗运算符替换成⊕,定理仍然成立。
与矩阵的常规加法和乘法不同,Kronecker和与乘积并不要求两个矩阵有相容性。另外,Kronecker和与乘积不满足交换律。
MATLAB中提供的函数C=kron(A,B)可直接计算两个矩阵的Kronecker积A⊗B。仿照该函数,可以编写出Kronecker和的求解函数kronsum()。
function C=kronsum(A,B) [ma,na]=size(A); [mb,nb]=size(B); A=reshape(A,[1 ma 1 na]); B=reshape(B,[mb 1 nb 1]); C=reshape(bsxfun(@plus,A,B),[ma*mb na*nb]);
例2-34 已知如下两个矩阵A与B,试求其Kronecker乘积与Kronecker和。
解 可以先输入这两个矩阵,然后调用kron()函数,分别计算出A⊗B与B⊗A。
得出的结果如下所示。可见二者不同,说明Kronecker乘积不满足交换律。
还可以由下面的语句计算A⊕B与B⊕A。
>> kronsum(A,B), kronsum(B,A)
得出的结果如下所示,说明Kronecker和也不满足交换律。