Class: Matrix
- Inherits:
-
Object
- Object
- Matrix
- Defined in:
- lib/opr-calc/matrix.rb
Overview
Props to rosettacode.org/wiki/Cholesky_decomposition#Ruby :L
Instance Method Summary collapse
-
#cholesky_factor ⇒ Object
Determines the [L] matrix through Cholesky decomposition.
-
#output ⇒ Object
A helpful debug function for Matrices.
-
#symmetric? ⇒ Boolean
Returns whether or not the Matrix is symmetric (en.wikipedia.org/wiki/Symmetric_matrix).
Instance Method Details
#cholesky_factor ⇒ Object
Determines the [L] matrix through Cholesky decomposition. To obtain [L]*, just transpose the matrix, it should work.
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# File 'lib/opr-calc/matrix.rb', line 39 def cholesky_factor # We need a symmetric matrix for Cholesky decomposition. raise ArgumentError, "must provide a symmetric matrix" unless symmetric? # Make a new matrix to return. l = Array.new(row_size) { Array.new(row_size, 0) } (0...row_size).each do |k| (0...row_size).each do |i| if i == k sum = (0..k-1).inject(0.0) { |sum, j| sum + l[k][j] ** 2 } val = Math.sqrt(self[k,k] - sum) l[k][k] = val elsif i > k sum = (0..k-1).inject(0.0) { |sum, j| sum + l[i][j] * l[k][j] } val = (self[k,i] - sum) / l[k][k] l[i][k] = val end end end Matrix[*l] end |
#output ⇒ Object
A helpful debug function for Matrices.
64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/opr-calc/matrix.rb', line 64 def output (0..self.row_size - 1).each do |row_number| (0..self.column_size - 1).each do |column_number| printf("%8.4f ", self[row_number, column_number]) end printf("\n") end self end |
#symmetric? ⇒ Boolean
Returns whether or not the Matrix is symmetric (en.wikipedia.org/wiki/Symmetric_matrix).
24 25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/opr-calc/matrix.rb', line 24 def symmetric? # Matrices can't be symmetric if they're not square. return false unless square? (0...row_size).each do |i| (0..i).each do |j| return false if self[i,j] != self[j,i] end end true end |