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.
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/opr-calc/matrix.rb', line 41 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.
71 72 73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/opr-calc/matrix.rb', line 71 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 36 37 |
# 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 |