A*M*B=I 已知A和B,A和B都不是方陣,求解M?

A: 3x5

B: 5x3

都是已知的

討厭的是A和B都不是方陣,不能簡單地求逆;

如果套用偽逆的話,這裡也很難湊出A*pinv(A)=I 或者 pinv(B)*B=I的形式

這個應該如何求解呢?


接著 @龔譯凡 的解釋,根據Kronecker Product的性質

http://www.siam.org/books/textbooks/OT91sample.pdf

vec(AMB) = (B"otimesA)*vec(M) ,

也就是說, 用vec() 運算符在原等式兩邊同時操作,可以把原方程可以轉化成一個標準的線性方程

(B"*otimesA)*vec(M) = vec(I)

翻譯成MATLAB代碼,就是

&>&> I = eye(3);

&>&> M_vec = kron(B."*A)I(:);

&>&> M = reshape(M_vec, 5,5);


有兩個方法求M,Pseudo Inverse和SVD,偽逆的方法是可行的。

只考慮實矩陣,A,B分別行列滿秩。

方法1-Pseudo Inverse:A,B的偽逆為別為

.~~~~~~~~~~~~~~~~~~~~~~A^{+} = A^T(AA^T)^{-1},~ B^{+}=(B^TB)^{-1}B^T,

並且滿足

.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~AA^{+} = I,~ B^{+}B=I,

因此取M=A^{+}B^{+}即可。

m = 3;
n = 5;

A = randn(m, n);
B = randn(n, m);

iA1 = (A") /(A*A");
iB1 = (B"*B) B";

M = iA1*iB1;
A*M*B

方法2-SVD:方法2與方法一殊途同歸。考慮MATLAB下的經濟型SVD,求解A的右逆,B的左逆

[u1, s1, v1] = svd(A, "econ");
is1 = diag(diag(s1).^(-1));
iA2 = (v1)*is1*(u1");

[u2, s2, v2] = svd(B, "econ");
is2 = diag(diag(s2).^(-1));
iB2 = (v2)*is2*(u2");

M = iA2*iB2;
A*M*B

然後M是它們的積。

兩個方法返回的結果一致,另外還可以考慮將A的行,B的列單位正交化的方法。


手機不好打…請搜索kronecker積


好像沒那麼麻煩

A M B = E

設 A = U1 D1 V1, B = U2 D2 V2

U1 D1 V1 M U2 D2 V2 = E

M = V1" D1^-1 U1" V2" D2^-1 U2"

D一定full rank,否則相乘後一定不等於full rank的E


可不可以兩邊左乘A的逆,右乘以B的逆,matlab有廣義逆的具體語句


1,你可以試試matlab 運算符,幫助你求解廣義逆,應該就是偽逆

2,試試將A與B矩陣分解,比如SVD分解


推薦閱讀:

向量的2範數求導?
如何求矩陣的正交補?
為什麼核範數能凸近似矩陣的秩?為什麼核範數是凸的?
矩陣的核範數的導數是什麼?
向量/矩陣導數是屬於哪個學科的內容?有什麼好的教材/資料可以推薦?

TAG:MATLAB | 機器學習 | 矩陣 |