[フレーム]

Class: Matrix::EigenvalueDecomposition

Inherits:
Object
  • Object
  • Matrix::EigenvalueDecomposition
show all
Defined in:
opal/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

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 'opal/stdlib/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_matrixObject Also known as: d

Returns the block diagonal eigenvalue matrix +D+

73
74
75
# File 'opal/stdlib/matrix/eigenvalue_decomposition.rb', line 73
def eigenvalue_matrix
 Matrix .diagonal (*eigenvalues)
end

#eigenvaluesObject

Returns the eigenvalues in an array

59
60
61
62
63
# File 'opal/stdlib/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_matrixObject Also known as: v

Returns the eigenvector matrix +V+

43
44
45
# File 'opal/stdlib/matrix/eigenvalue_decomposition.rb', line 43
def eigenvector_matrix
 Matrix .send(:new, build_eigenvectors.transpose)
end

#eigenvector_matrix_invObject Also known as: v_inv

Returns the inverse of the eigenvector matrix +V+

50
51
52
53
54
# File 'opal/stdlib/matrix/eigenvalue_decomposition.rb', line 50
def eigenvector_matrix_inv
 r = Matrix .send(:new, build_eigenvectors)
 r = r.transpose.inverse unless @symmetric
 r
end

#eigenvectorsObject

Returns an array of the eigenvectors

67
68
69
# File 'opal/stdlib/matrix/eigenvalue_decomposition.rb', line 67
def eigenvectors
 build_eigenvectors.map{|ev| Vector .send(:new, ev)}
end

#to_aryObject Also known as: to_a

Returns [eigenvector_matrix, eigenvalue_matrix, eigenvector_matrix_inv]

80
81
82
# File 'opal/stdlib/matrix/eigenvalue_decomposition.rb', line 80
def to_ary
 [v, d, v_inv]
end

AltStyle によって変換されたページ (->オリジナル) /