A、B 和 C 是矩阵。
A*B = C
现在我想做一个反向操作,即使用 B 和 C 计算 A。我该怎么做?Matlab 说 B 应该是一个方阵来计算它的逆。
如果存在唯一的解决方案,那么最好使用 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 和 slash 都产生相同的解决方案,因为 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
slash 和 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
请注意,我已将括号安排得尽可能高效,因为 MATLAB 将使用 R 的属性作为三角矩阵来简单地进行反向求解。我们不希望 MATLAB 分解已经分解的矩阵。
但是现在让我们看一下vahid提出的一个:
Ahat5 = C*B'*(inv(B*B'))
Ahat5 =
1.9970703125 2.998046875 4.0029296875
然而,vahid 提出的解决方案简直太糟糕了。不要使用最后一种形式。请。人们告诉你不要这样做是有原因的,或者他们应该告诉你!是的,我知道有一群人不知道所涉及的数学,他们一直在传播它。你甚至可以在一些不知情的教科书中找到它。
pinv 的好处是它适用于任何矩阵,无论是否为单数。如果存在解决方案,它会找到一个。如果解决方案是唯一的,它将起作用。如果解决方案不是唯一的,那么您期望什么?
您可以使用反斜杠运算符:
% if A*C = B
C = A\B
我不认为非矩形 A 的解决方案是独一无二的......
首先将两边乘以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)