Class: Matrix

Inherits:
Object
  • Object
show all
Defined in:
lib/opr-calc/matrix.rb

Overview

Instance Method Summary collapse

Instance Method Details

#cholesky_factorObject

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

Raises:

  • (ArgumentError)


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

#outputObject

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).

Returns:

  • (Boolean)


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