From: "pypypy567 (py _)" Date: 2012-10-23T21:28:38+09:00 Subject: [ruby-dev:46251] [ruby-trunk - Bug #7208][Open] 複素固有値を持つ行列に対する Matrix#eigensystem の返り値が正しくない Issue #7208 has been reported by pypypy567 (py _). ---------------------------------------- Bug #7208: 複素固有値を持つ行列に対する Matrix#eigensystem の返り値が正しくない https://bugs.ruby-lang.org/issues/7208 Author: pypypy567 (py _) Status: Open Priority: Normal Assignee: Category: Target version: ruby -v: ruby 1.9.3p286 (2012-10-12 revision 37165) [i386-mswin32_100] =begin 概要: Matrix[[0, 1], [-1, 0]] などのように対角化可能だが固有値に複素数を含む行列に対して Matrix#eigensystem が正しい結果を返さないようです。 再現手順: irb(main):001:0> RUBY_DESCRIPTION => "ruby 1.9.3p286 (2012-10-12 revision 37165) [i386-mswin32_100]" irb(main):002:0> require 'matrix' => true irb(main):003:0> m = Matrix[[0, 1], [-1, 0]] => Matrix[[0, 1], [-1, 0]] irb(main):004:0> v, d, v_inv = m.eigensystem ExceptionForMatrix::ErrNotRegular: Not Regular Matrix from C:/ruby193/lib/ruby/1.9.1/matrix.rb:930:in `block in inverse_from' from C:/ruby193/lib/ruby/1.9.1/matrix.rb:920:in `upto' from C:/ruby193/lib/ruby/1.9.1/matrix.rb:920:in `inverse_from' from C:/ruby193/lib/ruby/1.9.1/matrix.rb:912:in `inverse' from C:/ruby193/lib/ruby/1.9.1/matrix/eigenvalue_decomposition.rb:51:in `eigenvector_matrix_inv' from C:/ruby193/lib/ruby/1.9.1/matrix/eigenvalue_decomposition.rb:80:in `to_ary' from (irb):4 from C:/ruby193/bin/irb.bat:19:in `
' 説明: 実行列 m が対角化可能なら m.eigensystem は以下のような分解を与えます。 (Float で計算されるので誤差により等しくならないことがあります。) v * d * v_inv == m しかし固有値に複素数を含む場合は上記のように上手くいかないようです。 最初は単にそういうのは非対応なのかと思いましたがそういうわけではなさそうです。 エラーの出所を追ってみたところ Matrix::EigenvalueDecomposition#build_eigenvectors が不正な値を返しているように思えました。 ソースコード: http://bugs.ruby-lang.org/projects/ruby-trunk/repository/revisions/32355/entry/lib/matrix/eigenvalue_decomposition.rb#L85 コードのコメントに有る URL の説明を読んでみると、正直仕組みはまったく分かってないのですが、添付したパッチのようにするのが正しいような気がしました。 試しに手元の ruby の該当部分を同じように書きかえてみたら期待通りの結果が返りました。 =end -- http://bugs.ruby-lang.org/