再現手順:
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
しかし固有値に複素数を含む場合は上記のように上手くいかないようです。
最初は単にそういうのは非対応なのかと思いましたがそういうわけではなさそうです。
再現手順:
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
しかし固有値に複素数を含む場合は上記のように上手くいかないようです。
最初は単にそういうのは非対応なのかと思いましたがそういうわけではなさそうです。
再現手順:
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
しかし固有値に複素数を含む場合は上記のように上手くいかないようです。
最初は単にそういうのは非対応なのかと思いましたがそういうわけではなさそうです。