A,B和C是矩阵。
A*B = C
现在我想做一个反向,即用B和C计算A.我该怎么办? Matlab说B应该是一个平方矩阵来计算它的倒数。
答案 0 :(得分:6)
如果存在唯一解决方案,那么最好使用pinv来找到它。使用schwarz提出的例子......
A = [2 3 4];
B = [11 11 11; 12 12 12; 13 13 13];
C = A*B;
Ahat = C*pinv(B)
Ahat =
2.788 3.0415 3.2949
问题是,B是单数。所以可能存在无限多的解决方案。
B = magic(3)
B =
8 1 6
3 5 7
4 9 2
A = [2 3 4];
C = A*B
C =
41 53 41
Ahat = C*pinv(B)
Ahat =
2 3 4
Ahat = C/B
Ahat =
2 3 4
看到pinv和斜杠都产生相同的解决方案,因为B是非单数的并且条件良好。
但是,如果我们尝试一些条件不太好的东西呢?在下一个例子中,我将使用一个并不那么糟糕的矩阵。
>> A = [2 3 4];
>> B = [1 1 1;1 2 3;2 3 4.00001]
B =
1 1 1
1 2 3
2 3 4.00001
嗯,它有一个相当大的条件数,但是这个矩阵不是我称之为数字奇异的。
cond(B)
ans =
2865128.4655819
C = A*B
C =
13 20 27.00004
让我们现在尝试几种不同的解决方案。
format long g
Ahat1 = C*pinv(B)
Ahat1 =
2 3 4
pinv做得很好。
Ahat2 = C/B
Ahat2 =
2.00000000017764 3.00000000017764 3.99999999982236
Ahat3 = C*inv(B)
Ahat3 =
1.99999999953434 2.99999999953434 4.00000000046566
斜线和inv都不错,虽然在这种情况下显然更糟。对于这个问题,pinv解决方案似乎更稳定。
我们也可以在此处抛出QR分解。使用旋转解决方案以获得最佳稳定性。请注意,当您的系统几乎是单一的时,我们仍然会遇到问题。
[Q,R,P] = qr(B);
你可以通过检查R来看问题。最后一个对角元素与其余元素相比很小。这将导致解决方案出现问题,放大任何噪音。
R
R =
-5.09902735824196 -2.35339392337313 -3.72620671848107
0 0.679365175314723 0.339681455393392
0 0 -2.88675134520189e-06
QR因子具有Q * R * P'= B的特性所以我们可以在这里求解A:
Ahat4 = ((C*P)/R)*Q'
Ahat4 =
2.00000000076851 3.0000000007685 3.9999999992315
请注意,我已经将parens安排得尽可能高效,因为MATLAB将使用R的属性作为三角矩阵来简单地进行后向解析。我们不希望MATLAB将已经分解的矩阵分解。
但现在让我们来看看vahid提出的一个:
Ahat5 = C*B'*(inv(B*B'))
Ahat5 =
1.9970703125 2.998046875 4.0029296875
然而,由vahid提出的解决方案简直太糟糕了。不要使用最后一个表格。请。有人告诉你不要这样做,或者他们应该告诉你的原因!是的,我知道有一群人不了解所涉及的数学,他们继续传播它。你甚至可以在一些不知情的教科书中找到它。
关于pinv的好处是它适用于任何矩阵,单数或非单数。如果存在解决方案,它将找到一个解决方案。如果解决方案是唯一的,它将起作用。如果解决方案不是唯一的,那么,你期望什么?
答案 1 :(得分:2)
您可以使用反斜杠运算符:
% if A*C = B
C = A\B
我不认为非矩形A的解决方案虽然是唯一的......
答案 2 :(得分:-1)
首先将A*B=C
的两边乘以B'
(B的转置):
A*B*B'=C*B'
设D=B*B'
(D是方阵):
A*D=C*B'
现在将上述等式的两边乘以inv(D)
:
A*D*inv(D)=C*B'*inv(D)
D*inv(D)=I
,所以:
A=C*B'*inv(D)