Class: Matrix::EigenvalueDecomposition
- Inherits:
-
Object
- Object
- Matrix::EigenvalueDecomposition
- Defined in:
- lib/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
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/matrix/eigenvalue_decomposition.rb', line 19 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_count @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
73 74 75 |
# File 'lib/matrix/eigenvalue_decomposition.rb', line 73 def eigenvalue_matrix Matrix.diagonal(*eigenvalues) end |
#eigenvalues ⇒ Object
Returns the eigenvalues in an array
59 60 61 62 63 |
# File 'lib/matrix/eigenvalue_decomposition.rb', line 59 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
43 44 45 |
# File 'lib/matrix/eigenvalue_decomposition.rb', line 43 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
50 51 52 53 54 |
# File 'lib/matrix/eigenvalue_decomposition.rb', line 50 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
67 68 69 |
# File 'lib/matrix/eigenvalue_decomposition.rb', line 67 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]
80 81 82 |
# File 'lib/matrix/eigenvalue_decomposition.rb', line 80 def to_ary [v, d, v_inv] end |