Class: Matrix
- Inherits:
-
Object
- Object
- Matrix
- Defined in:
- lib/statsample-timeseries/utility.rb
Class Method Summary collapse
-
.chain_dot(*args) ⇒ Object
==Chain Product Class method Returns the chain product of two matrices ===Usage: Let
abe 4 * 3 matrix, Letbbe 3 * 3 matrix, Letcbe 3 * 1 matrix, thenMatrix.chain_dot(a, b, c)===NOTE: Send the matrices in multiplicative order with proper dimensions.
Instance Method Summary collapse
-
#add_constant(prepend = true) ⇒ Object
==Adds a column of constants.
-
#cholesky ⇒ Object
==Cholesky decomposition Reference: http://en.wikipedia.org/wiki/Cholesky_decomposition ===Description Cholesky decomposition is reprsented by
M = L X L*, where M is the symmetric matrix andLis the lower half of cholesky matrix, andL*is the conjugate form ofL. -
#set_column(i, arr) ⇒ Object
populates column i of given matrix with arr.
-
#set_row(i, arr) ⇒ Object
populates row i of given matrix with arr.
-
#squares_of_sum ⇒ Object
==Squares of sum Does squares of sum in column order.
-
#symmetric? ⇒ Boolean
==Symmetric?
symmetric?is present in Ruby Matrix 1.9.3+, but not in 1.8.* ===Returns bool.
Class Method Details
.chain_dot(*args) ⇒ Object
==Chain Product
Class method
Returns the chain product of two matrices
===Usage:
Let a be 4 * 3 matrix,
Let b be 3 * 3 matrix,
Let c be 3 * 1 matrix,
then Matrix.chain_dot(a, b, c)
===NOTE:
Send the matrices in multiplicative order with proper dimensions
87 88 89 90 91 92 93 94 |
# File 'lib/statsample-timeseries/utility.rb', line 87 def self.chain_dot(*args) #inspired by Statsmodels begin args.reduce { |x, y| x * y } #perform matrix multiplication in order rescue ExceptionForMatrix::ErrDimensionMismatch puts "ExceptionForMatrix: Please provide matrices with proper multiplicative dimensions" end end |
Instance Method Details
#add_constant(prepend = true) ⇒ Object
==Adds a column of constants. Appends a column of ones to the matrix/array if first argument is false If an n-array, first checks if one column of ones is already present if present, then original(self) is returned, else, prepends with a vector of ones
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
# File 'lib/statsample-timeseries/utility.rb', line 101 def add_constant(prepend = true) #for Matrix (0...column_size).each do |i| if self.column(i).map(&:to_f) == Object::Vector.elements(Array.new(row_size, 1.0)) return self end end #append/prepend a column of one's vectors = (0...row_size).map do |r| if prepend [1.0].concat(self.row(r).to_a) else self.row(r).to_a.push(1.0) end end return Matrix.rows(vectors) end |
#cholesky ⇒ Object
==Cholesky decomposition
Reference: http://en.wikipedia.org/wiki/Cholesky_decomposition
===Description
Cholesky decomposition is reprsented by M = L X L*, where
M is the symmetric matrix and L is the lower half of cholesky matrix,
and L* is the conjugate form of L.
===Returns
Cholesky decomposition for a given matrix(if symmetric)
===Utility
Essential matrix function, requisite in kalman filter, least squares
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'lib/statsample-timeseries/utility.rb', line 58 def cholesky raise ArgumentError, "Given matrix should be symmetric" unless symmetric? c = Matrix.zero(row_size) 0.upto(row_size - 1).each do |k| 0.upto(row_size - 1).each do |i| if i == k sum = (0..(k-1)).inject(0.0){ |sum, j| sum + c[k, j] ** 2 } value = Math.sqrt(self[k,k] - sum) c[k, k] = value elsif i > k sum = (0..(k-1)).inject(0.0){ |sum, j| sum + c[i, j] * c[k, j] } value = (self[k,i] - sum) / c[k, k] c[i, k] = value end end end c end |
#set_column(i, arr) ⇒ Object
populates column i of given matrix with arr
120 121 122 123 124 125 126 |
# File 'lib/statsample-timeseries/utility.rb', line 120 def set_column(i, arr) columns = self.column_vectors column = columns[i].to_a column[0...arr.size] = arr columns[i] = column return Matrix.columns(columns) end |
#set_row(i, arr) ⇒ Object
populates row i of given matrix with arr
129 130 131 132 133 134 135 136 137 138 |
# File 'lib/statsample-timeseries/utility.rb', line 129 def set_row(i, arr) #similar implementation as set_column #writing and commenting metaprogrammed version #Please to give opinion :) rows = self.row_vectors row = rows[i].to_a row[0...arr.size] = arr rows[i] = row return Matrix.rows(rows) end |
#squares_of_sum ⇒ Object
==Squares of sum Does squares of sum in column order. Necessary for computations in various processes
27 28 29 30 31 |
# File 'lib/statsample-timeseries/utility.rb', line 27 def squares_of_sum (0...column_size).map do |j| self.column(j).sum**2 end end |
#symmetric? ⇒ Boolean
==Symmetric?
symmetric? is present in Ruby Matrix 1.9.3+, but not in 1.8.*
===Returns
bool
37 38 39 40 41 42 43 44 45 46 |
# File 'lib/statsample-timeseries/utility.rb', line 37 def symmetric? return false unless square? (0...row_size).each do |i| 0.upto(i).each do |j| return false if self[i, j] != self[j, i] end end true end |