[ruby-list:48723] NMatrix による除算

From: "KISHIMOTO, Makoto" <ksmakoto@...4u.or.jp>
Date: 2012-04-28 14:21:00 UTC
List: ruby-list #48723
きしもとです

NArray の NMatrix を試していて、行列での(右)除算が、逆行列を右から
かけたのではなく、左からかけたのと同じになることに気付きました。

$ irb19 -rnarray
irb(main):001:0> a = NMatrix[[1.0, 2.0], [3.0, 4.0]]
=> NMatrix.float(2,2):
[ [ 1.0, 2.0 ],
  [ 3.0, 4.0 ] ]
irb(main):002:0> b = NVector[1.0, 2.0]
=> NVector.float(2):
[ 1.0, 2.0 ]
irb(main):003:0> b/a
=> NVector.float(2):
[ 0.0, 0.5 ]
irb(main):004:0> b*a.inverse
=> NVector.float(2):
[ 1.0, 1.11022e-16 ]
irb(main):005:0> b*a.transpose.inverse
=> NVector.float(2):
[ 0.0, 0.5 ]

このように b/a の結果が b*a.inverse ではなく a.inverse*b ないし
b*a.transpose.inverse と同じになります。わかっていれば特に問題
ありませんが、直感的でないような気もします。

マニュアルにある通り、b/a の実装は、逆行列を求めたりはせず、
a.lu.solve(b) と同等になるとのことなので、a.lu.solve(b) が元々
そのような仕様で、a.lu.solve(b) の略記法として b/a のようにも書ける、
としたためそうなったなのか、それとも何か深い理由があるのか、
どういったものでしょうか?

In This Thread

Prev Next