class Matrix

Props to rosettacode.org/wiki/Cholesky_decomposition#Ruby :L

Public Instance Methods

cholesky_factor() click to toggle source

Determines the [L] matrix through Cholesky decomposition. To obtain [L]*, just transpose the matrix, it should work.

# 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() click to toggle source

A helpful debug function for Matrices.

# 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?() click to toggle source

Returns whether or not the Matrix is symmetric (en.wikipedia.org/wiki/Symmetric_matrix).

# 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