Class | Matrix::EigenvalueDecomposition |
In: |
lib/backports/1.9.2/stdlib/matrix/eigenvalue_decomposition.rb
|
Parent: | Object |
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
Constructs the eigenvalue decomposition for a square matrix A
# File lib/backports/1.9.2/stdlib/matrix/eigenvalue_decomposition.rb, line 18 18: def initialize(a) 19: # @d, @e: Arrays for internal storage of eigenvalues. 20: # @v: Array for internal storage of eigenvectors. 21: # @h: Array for internal storage of nonsymmetric Hessenberg form. 22: raise TypeError, "Expected Matrix but got #{a.class}" unless a.is_a?(Matrix) 23: @size = a.row_size 24: @d = Array.new(@size, 0) 25: @e = Array.new(@size, 0) 26: 27: if (@symmetric = a.symmetric?) 28: @v = a.to_a 29: tridiagonalize 30: diagonalize 31: else 32: @v = Array.new(@size) { Array.new(@size, 0) } 33: @h = a.to_a 34: @ort = Array.new(@size, 0) 35: reduce_to_hessenberg 36: hessenberg_to_real_schur 37: end 38: end
Returns the block diagonal eigenvalue matrix D
# File lib/backports/1.9.2/stdlib/matrix/eigenvalue_decomposition.rb, line 72 72: def eigenvalue_matrix 73: Matrix.diagonal(*eigenvalues) 74: end
Returns the eigenvalues in an array
# File lib/backports/1.9.2/stdlib/matrix/eigenvalue_decomposition.rb, line 58 58: def eigenvalues 59: values = @d.dup 60: @e.each_with_index{|imag, i| values[i] = Complex(values[i], imag) unless imag == 0} 61: values 62: end
Returns the eigenvector matrix V
# File lib/backports/1.9.2/stdlib/matrix/eigenvalue_decomposition.rb, line 42 42: def eigenvector_matrix 43: Matrix.send :new, build_eigenvectors.transpose 44: end
Returns the inverse of the eigenvector matrix V
# File lib/backports/1.9.2/stdlib/matrix/eigenvalue_decomposition.rb, line 49 49: def eigenvector_matrix_inv 50: r = Matrix.send :new, build_eigenvectors 51: r = r.transpose.inverse unless @symmetric 52: r 53: end
Returns an array of the eigenvectors
# File lib/backports/1.9.2/stdlib/matrix/eigenvalue_decomposition.rb, line 66 66: def eigenvectors 67: build_eigenvectors.map{|ev| Vector.send :new, ev} 68: end
Returns [eigenvector_matrix, eigenvalue_matrix, eigenvector_matrix_inv]
# File lib/backports/1.9.2/stdlib/matrix/eigenvalue_decomposition.rb, line 79 79: def to_ary 80: [v, d, v_inv] 81: end