Forum: Ruby-dev [ruby-trunk - Bug #7208][Open] 複素固有値を持つ行列に対する Matrix#eigensystem の返り値が正しくない

Posted by pypypy567 (py _) (Guest)
on 2012-10-23 14:28
(Received via mailing list)
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 `<main>'

説明:
実行列 m が対角化可能なら m.eigensystem は以下のような分解を与えます。
(Float で計算されるので誤差により等しくならないことがあります。)
  v * d * v_inv == m
しかし固有値に複素数を含む場合は上記のように上手くいかないようです。
最初は単にそういうのは非対応なのかと思いましたがそういうわけではなさそうです。

エラーの出所を追ってみたところ Matrix::EigenvalueDecomposition#build_eigenvectors 
が不正な値を返しているように思えました。
ソースコード: 
http://bugs.ruby-lang.org/projects/ruby-trunk/repo...
コードのコメントに有る URL 
の説明を読んでみると、正直仕組みはまったく分かってないのですが、添付したパッチのようにするのが正しいような気がしました。
試しに手元の ruby の該当部分を同じように書きかえてみたら期待通りの結果が返りました。
=end
Posted by marcandre (Marc-Andre Lafortune) (Guest)
on 2012-10-24 17:11
(Received via mailing list)
Issue #7208 has been updated by marcandre (Marc-Andre Lafortune).

Category set to lib
Assignee set to marcandre (Marc-Andre Lafortune)


----------------------------------------
Bug #7208: 複素固有値を持つ行列に対する Matrix#eigensystem の返り値が正しくない
https://bugs.ruby-lang.org/issues/7208#change-31472

Author: pypypy567 (py _)
Status: Open
Priority: Normal
Assignee: marcandre (Marc-Andre Lafortune)
Category: lib
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 `<main>'

説明:
実行列 m が対角化可能なら m.eigensystem は以下のような分解を与えます。
(Float で計算されるので誤差により等しくならないことがあります。)
  v * d * v_inv == m
しかし固有値に複素数を含む場合は上記のように上手くいかないようです。
最初は単にそういうのは非対応なのかと思いましたがそういうわけではなさそうです。

エラーの出所を追ってみたところ Matrix::EigenvalueDecomposition#build_eigenvectors 
が不正な値を返しているように思えました。
ソースコード: 
http://bugs.ruby-lang.org/projects/ruby-trunk/repo...
コードのコメントに有る URL 
の説明を読んでみると、正直仕組みはまったく分かってないのですが、添付したパッチのようにするのが正しいような気がしました。
試しに手元の ruby の該当部分を同じように書きかえてみたら期待通りの結果が返りました。
=end
Posted by usa (Usaku NAKAMURA) (Guest)
on 2012-12-21 14:20
(Received via mailing list)
Issue #7208 has been updated by usa (Usaku NAKAMURA).

Status changed from Open to Assigned


----------------------------------------
Bug #7208: 複素固有値を持つ行列に対する Matrix#eigensystem の返り値が正しくない
https://bugs.ruby-lang.org/issues/7208#change-34944

Author: pypypy567 (py _)
Status: Assigned
Priority: Normal
Assignee: marcandre (Marc-Andre Lafortune)
Category: lib
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 `<main>'

説明:
実行列 m が対角化可能なら m.eigensystem は以下のような分解を与えます。
(Float で計算されるので誤差により等しくならないことがあります。)
  v * d * v_inv == m
しかし固有値に複素数を含む場合は上記のように上手くいかないようです。
最初は単にそういうのは非対応なのかと思いましたがそういうわけではなさそうです。

エラーの出所を追ってみたところ Matrix::EigenvalueDecomposition#build_eigenvectors 
が不正な値を返しているように思えました。
ソースコード: 
http://bugs.ruby-lang.org/projects/ruby-trunk/repo...
コードのコメントに有る URL 
の説明を読んでみると、正直仕組みはまったく分かってないのですが、添付したパッチのようにするのが正しいような気がしました。
試しに手元の ruby の該当部分を同じように書きかえてみたら期待通りの結果が返りました。
=end
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.