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
B は非特異であり、条件が整っているため、pinv とスラッシュの両方が同じ解をもたらすことを確認してください。
しかし、あまり条件の良くないものを試してみたらどうでしょうか? この次の例では、それほど悪くないマトリックスを使用します。
>> 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 は正方D=B*B'
行列) とする:
A*D=C*B'
上記の式の両辺に を掛けますinv(D)
。
A*D*inv(D)=C*B'*inv(D)
D*inv(D)=I
、 それで:
A=C*B'*inv(D)