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)


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

#outputObject

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

Returns:

  • (Boolean)


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