本文使用MATLAB语言表述运算,假定读者对MATLAB各种运算符意义已有了解。如果你记不住这些复杂规则也没关系,可以收藏本文当作工具手册,需要时直接翻出来查。
首先是矩阵两个维度的不同称呼。第1维行号不同,第2维列号不同。(:,1)称列向量,第2维恒为1;(1,:)称行向量,第1维恒为1;即,X向量指X维恒为1的向量。第1维又称左维,第2维又称右维。注意不要跟运算符的左右混淆。
尺寸变换关系
- 矩阵乘法*:消去(运算符的)左2右1,保留左1右2。即(A1,A2)*(B1,B2)=(A1,B2)。也可记为“消中间,留两边”。
- 矩阵左除\:消去(运算符的)左右1,保留左右2。即(A1,A2)\(B1,B2)=(A2,B2)。也可记为“消两左,留两右(维度)”
- 矩阵右除/:消去(运算符的)左右2,保留左右1。即(A1,A2)/(B1,B2)=(A1,B1)。也可记为“消两右,留两左(维度)”
- 上述所有运算,消去的两个维度都必须等长。乘法消中间;除法的左右跟消的左右是一致的,谁除消谁。
- 左除和左转置乘,结果尺寸相同,但数值意义不同,即
isequal(size(A\B),size(A.'*B) - 右除和乘右转置,结果尺寸相同,但数值意义不同,即
isequal(size(A/B),size(A*B.')
一般来说,矩阵乘法被看作是,将某种变换关系应用到某对象,“变换”和“对象”谁在乘号左边谁在右边则没有一定之规。矩阵除法则被看作是已知变换结果,根据变换反推原对象,或者根据原对象反推变换。例如,在主成分分析中,PCA分数就是原始数据乘上PCA系数得到:在这个变换关系中,PCA系数就是变换矩阵,PCA分数就是结果矩阵。
如果参与运算的矩阵不含方阵,则可以根据上述尺寸关系轻易理清三者的正确乘除关系。但如果包含方阵,则尺寸关系可能出现混淆,要特别小心运算的意义是否正确。此外,由于除法和带转置的乘法尺寸关系相同,也容易混淆。
一个新手容易犯错的点:变换和原对象一定是乘法关系,不会因为转置而变成除法关系。同理,变换结果只能用于除法,左除还是右除取决于原本的乘法关系,但无论转置与否,变换结果都不能和变换或原对象相乘。因此,不能仅根据尺寸关系判断应当使用乘法还是除法或是否要转置,乘除法的判定必须确认你要计算的是顺向变换关系还是逆向反推关系。
数值变换关系
数值变换比尺寸变换更严格。数值不变的变换一定保证尺寸不变,反之则不一定。但是,数值变换仍然会丢失信息。本节所有数值变换只能保证变换逻辑上等价,实际计算时根据具体数值大小会有误差,对于一些奇异情况甚至会有巨大的误差。但在非奇异情况、数值精度要求不高时,通常可以视为等价变换。
灵活运用数值变换关系,可以简化表达式,提高性能。
单目运算
矩阵最常见的单目变换是求逆和转置。对一个矩阵进行反复求逆和转置时,无论以何种顺序进行多少次求逆、转置的组合,一定可以将所有的求逆两两消去,所有的转置两两消去。求逆和转置的顺序可以随意交换和组合,因此一定可以化简为最多一次求逆和一次转置。因此下面的数值变换表不会考虑两层以上的求逆/转置。
但需要注意,有些矩阵是不可逆的,因此不适用求逆相关的规则。
双目运算
双目运算包括乘法、左除和右除。它们的变换关系依赖单目运算。
A*B==inv(A)\B==A/inv(B)==inv(inv(B)*inv(A))==(B.'*A.').'A\B==(B.'/A.').'==inv(A)*BA/B==A*inv(B)==(B.'\A.').'
记忆口诀:乘除变换,谁除谁逆;左右除变换,三转置一交换;乘法交换,三转或三逆;左右除内部不能交换。
连续乘除式
连续乘除式指形如A1?A2?A3…这样的表达式,其中 A1 A2 A3 … 是矩阵或其任意的转置、求逆形式,?是乘或左右除号。在这样的乘除式中,通常的运算顺序是从左到右,并且不能交换。但是,可以加减括号改变运算顺序,只要遵守以下规则:
- 乘号左右都可以增减括号
- 除号的左侧可以增减括号
- 右除的右侧通常不能增减括号,但有一个例外:如果括号内是一对相邻相乘的互逆矩阵,则可以
- 左除的右侧通常可以增减括号,但有一个例外:如果括号内的最后一级运算符是左除,则不能
在没有互逆抵消的表达式中,改变运算顺序不影响表达式的复杂度,但在性能优化中可能有意义。例如要循环计算A\B/C时:
for a=1:100
A(a)=a;
D{a}=A\B/C;
end
上述代码中,B和C不随循环改变,改变的只有A。因此可以将B/C在循环外只算一次:
E=B/C;
for a=1:100
A(a)=a;
D{a}=A\E;
end
这样循环内部可以减少一次除法。这实际上相当于在左除右边加括号,且括号内最后一级运算不是左除,不违反除法括号规则。但如果要算的是A/B\C就无法这样优化,因为不能在右除号右边加括号。
方程移项消元
在解矩阵乘除方程时,移项和消元要注意等式左右的“左右”要匹配。例如给定等式A…B==C…D,省略号表示中间任意若干乘除项(不能有加减,否则当然要全部加括号),此时如果要加一个乘除项E,允许的等价变换如下:
E*A…B==E*C…DA…B*E==C…D*EE\(A…B)==E\(C…D),如果省略号内最后一级运算不是左除,可以直接去掉括号A…B\E==C…D\EE/(A…B)==E/(C…D),除非(A…B)或(C…D)恰好等于单位矩阵,否则不能去括号A…B/E==C…D/E
上述变换规则反过来就是消元规则。特别地,对于表达式最左边的除项:
E\A…B==E\C…D,如果省略号内最后一级运算是左除,则无法消元,否则可以消为A…B==C…DE/A…B==E/C…D,除非(A…B)或(C…D)恰好等于单位矩阵,否则无法消元
同理可以推导出移项规则:
E*(A…B)==C…D<=>A…B==E\(C…D),左乘移项左左除。如果有任何一个括号中最后一级运算不是左除,都可以去掉那个括号。A…B*E==C…D<=>A…B==C…D/E,右乘移项右右除。A…B\E==C…D<=>inv(A…B)==C…D/E<=>A…B==inv(C…D/E)<=>A…B==E*inv(C…D),右左除移左乘逆E/(A…B)==C…D<=>inv(A…B)==inv(E)*C…D<=>A…B==inv(C…D)*E,左右除移逆右乘E/A…B==C…D,通常不能移项,除非(A…B)或(C…D)恰好等于单位矩阵
这些规则看似复杂,其实都可以由单双目基础规则推导而来。