Class: Matrix::EigenvalueDecomposition

Inherits:
Object
• Object
show all
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`.

• 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`.

• Returns an array of the eigenvectors.

• 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`

Raises:

• (TypeError)
 ``` 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 ⇒ ObjectAlso 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 ⇒ ObjectAlso 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 ⇒ ObjectAlso 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 ⇒ ObjectAlso 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```