Class: Matrix::EigenvalueDecomposition
- Defined in:
- lib/backports/1.9.2/stdlib/matrix/eigenvalue_decomposition.rb
Overview
Eigenvalues and eigenvectors of a real matrix.
Computes the eigenvalues and eigenvectors of a matrix A.
If A is diagonalizable, this provides matrices V and D such that A = V*D*V.inv, where D is the diagonal matrix with entries equal to the eigenvalues and V is formed by the eigenvectors.
If A is symmetric, then V is orthogonal and thus A = V*D*V.t
Instance Method Summary collapse
-
#eigenvalue_matrix ⇒ Object
(also: #d)
Returns the block diagonal eigenvalue matrix
D
. -
#eigenvalues ⇒ Object
Returns the eigenvalues in an array.
-
#eigenvector_matrix ⇒ Object
(also: #v)
Returns the eigenvector matrix
V
. -
#eigenvector_matrix_inv ⇒ Object
(also: #v_inv)
Returns the inverse of the eigenvector matrix
V
. -
#eigenvectors ⇒ Object
Returns an array of the eigenvectors.
-
#initialize(a) ⇒ EigenvalueDecomposition
constructor
Constructs the eigenvalue decomposition for a square matrix
A
. -
#to_ary ⇒ Object
(also: #to_a)
Returns [eigenvector_matrix, eigenvalue_matrix, eigenvector_matrix_inv].
Constructor Details
#initialize(a) ⇒ EigenvalueDecomposition
Constructs the eigenvalue decomposition for a square matrix A
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# File 'lib/backports/1.9.2/stdlib/matrix/eigenvalue_decomposition.rb', line 18 def initialize(a) # @d, @e: Arrays for internal storage of eigenvalues. # @v: Array for internal storage of eigenvectors. # @h: Array for internal storage of nonsymmetric Hessenberg form. raise TypeError, "Expected Matrix but got #{a.class}" unless a.is_a?(Matrix) @size = a.row_size @d = Array.new(@size, 0) @e = Array.new(@size, 0) if (@symmetric = a.symmetric?) @v = a.to_a tridiagonalize diagonalize else @v = Array.new(@size) { Array.new(@size, 0) } @h = a.to_a @ort = Array.new(@size, 0) reduce_to_hessenberg hessenberg_to_real_schur end end |
Instance Method Details
#eigenvalue_matrix ⇒ Object Also known as: d
Returns the block diagonal eigenvalue matrix D
72 73 74 |
# File 'lib/backports/1.9.2/stdlib/matrix/eigenvalue_decomposition.rb', line 72 def eigenvalue_matrix Matrix.diagonal(*eigenvalues) end |
#eigenvalues ⇒ Object
Returns the eigenvalues in an array
58 59 60 61 62 |
# File 'lib/backports/1.9.2/stdlib/matrix/eigenvalue_decomposition.rb', line 58 def eigenvalues values = @d.dup @e.each_with_index{|imag, i| values[i] = Complex(values[i], imag) unless imag == 0} values end |
#eigenvector_matrix ⇒ Object Also known as: v
Returns the eigenvector matrix V
42 43 44 |
# File 'lib/backports/1.9.2/stdlib/matrix/eigenvalue_decomposition.rb', line 42 def eigenvector_matrix Matrix.send :new, build_eigenvectors.transpose end |
#eigenvector_matrix_inv ⇒ Object Also known as: v_inv
Returns the inverse of the eigenvector matrix V
49 50 51 52 53 |
# File 'lib/backports/1.9.2/stdlib/matrix/eigenvalue_decomposition.rb', line 49 def eigenvector_matrix_inv r = Matrix.send :new, build_eigenvectors r = r.transpose.inverse unless @symmetric r end |
#eigenvectors ⇒ Object
Returns an array of the eigenvectors
66 67 68 |
# File 'lib/backports/1.9.2/stdlib/matrix/eigenvalue_decomposition.rb', line 66 def eigenvectors build_eigenvectors.map{|ev| Vector.send :new, ev} end |
#to_ary ⇒ Object Also known as: to_a
Returns [eigenvector_matrix, eigenvalue_matrix, eigenvector_matrix_inv]
79 80 81 |
# File 'lib/backports/1.9.2/stdlib/matrix/eigenvalue_decomposition.rb', line 79 def to_ary [v, d, v_inv] end |