Class: Matrix
- Inherits:
-
Object
- Object
- Matrix
- Defined in:
- lib/matrix_extensions.rb
Overview
An extension to the Ruby Matrix class.
Class Method Summary collapse
-
.convert_vector_to_matrix(v, dimension) ⇒ Matrix
Convert vector to matrix for arithmetic operations.
-
.hconcat(*matrices) ⇒ Matrix
Concatenates two matrices horizontally (resulting in more columns).
-
.ones(rows = 1, columns = 1) ⇒ Matrix
Matrix prefilled with ones.
-
.vconcat(*matrices) ⇒ Matrix
Concatenates two matrices vertically (resulting in more rows).
-
.zeros(rows = 1, columns = 1) ⇒ Matrix
Matrix prefilled with zeros.
Instance Method Summary collapse
-
#element_division(m) ⇒ Matrix
Element-wise division.
-
#element_exponentiation(m) ⇒ Matrix
Element-wise exponentiation.
-
#element_multiplication(m) ⇒ Matrix
Element-wise multiplication.
-
#hpop(number_of_columns = 1) ⇒ Matrix
Removes trailing columns from a Matrix (destructive).
-
#vpop(number_of_rows = 1) ⇒ Matrix
Removes trailing rows from a Matrix (destructive).
Class Method Details
.convert_vector_to_matrix(v, dimension) ⇒ Matrix
Convert vector to matrix for arithmetic operations.
211 212 213 214 215 216 217 218 219 220 221 |
# File 'lib/matrix_extensions.rb', line 211 def self.convert_vector_to_matrix(v, dimension) raise TypeError, "#{v.class} is not a Vector" unless v.is_a? Vector if dimension == :row self.row_vector(v) elsif dimension == :column self.column_vector(v) else raise ArgumentError end end |
.hconcat(*matrices) ⇒ Matrix
Concatenates two matrices horizontally (resulting in more columns).
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/matrix_extensions.rb', line 27 def self.hconcat(*matrices) columns = [] matrices.each do |m| raise TypeError, "#{m.class} is not a Matrix or Vector" unless m.is_a?(Matrix) || m.is_a?(Vector) # convert Vector to Matrix m = self.convert_vector_to_matrix(m, :column) if m.is_a? Vector # check if dimensions match row_count ||= m.row_count Matrix.Raise ErrDimensionMismatch unless row_count == m.row_count # prepare array of columns m.column_vectors.each do |v| columns << v.to_a end end # create new matrix self.columns(columns) end |
.ones(rows = 1, columns = 1) ⇒ Matrix
Matrix prefilled with ones.
18 19 20 |
# File 'lib/matrix_extensions.rb', line 18 def self.ones(rows = 1, columns = 1) Matrix.build(rows, columns) { 1 } end |
.vconcat(*matrices) ⇒ Matrix
Concatenates two matrices vertically (resulting in more rows).
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/matrix_extensions.rb', line 54 def self.vconcat(*matrices) rows = [] matrices.each do |m| raise TypeError, "#{m.class} is not a Matrix or Vector" unless m.is_a?(Matrix) || m.is_a?(Vector) # convert Vector to Matrix m = self.convert_vector_to_matrix(m, :row) if m.is_a? Vector # check if dimensions match column_count ||= m.column_count Matrix.Raise ErrDimensionMismatch unless column_count == m.column_count # prepare array of columns m.row_vectors.each do |v| rows << v.to_a end end # create new matrix self.rows(rows) end |
.zeros(rows = 1, columns = 1) ⇒ Matrix
Matrix prefilled with zeros.
10 11 12 |
# File 'lib/matrix_extensions.rb', line 10 def self.zeros(rows = 1, columns = 1) Matrix.build(rows, columns) { 0 } end |
Instance Method Details
#element_division(m) ⇒ Matrix
Element-wise division.
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
# File 'lib/matrix_extensions.rb', line 111 def element_division(m) case m when Numeric return self./ m when Vector if row_count > column_count # Matrix is of dimension X * 1 (or there'll be an ErrDimensionMismatch) m = self.class.convert_vector_to_matrix(m, :column) else # Matrix is of dimension 1 * X (or there'll be an ErrDimensionMismatch) m = self.class.convert_vector_to_matrix(m, :row) end when Matrix else return apply_through_coercion(m, __method__) end Matrix.Raise ErrDimensionMismatch unless row_count == m.row_count && column_count == m.column_count rows = Array.new(row_count) do |i| Array.new(column_count) do|j| self[i, j] / m[i, j] end end new_matrix rows, column_count end |
#element_exponentiation(m) ⇒ Matrix
Element-wise exponentiation.
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 |
# File 'lib/matrix_extensions.rb', line 173 def element_exponentiation(m) case m when Numeric # self.** m will break rows = @rows.collect {|row| row.collect {|e| e ** m } } return new_matrix rows, column_count when Vector if row_count > column_count # Matrix is of dimension X * 1 (or there'll be an ErrDimensionMismatch) m = self.class.convert_vector_to_matrix(m, :column) else # Matrix is of dimension 1 * X (or there'll be an ErrDimensionMismatch) m = self.class.convert_vector_to_matrix(m, :row) end when Matrix else return apply_through_coercion(m, __method__) end Matrix.Raise ErrDimensionMismatch unless row_count == m.row_count && column_count == m.column_count rows = Array.new(row_count) do |i| Array.new(column_count) do|j| self[i, j] ** m[i, j] end end new_matrix rows, column_count end |
#element_multiplication(m) ⇒ Matrix
Element-wise multiplication.
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
# File 'lib/matrix_extensions.rb', line 142 def element_multiplication(m) case m when Numeric return self.* m when Vector if row_count > column_count # Matrix is of dimension X * 1 (or there'll be an ErrDimensionMismatch) m = self.class.convert_vector_to_matrix(m, :column) else # Matrix is of dimension 1 * X (or there'll be an ErrDimensionMismatch) m = self.class.convert_vector_to_matrix(m, :row) end when Matrix else return apply_through_coercion(m, __method__) end Matrix.Raise ErrDimensionMismatch unless row_count == m.row_count && column_count == m.column_count rows = Array.new(row_count) do |i| Array.new(column_count) do|j| self[i, j] * m[i, j] end end new_matrix rows, column_count end |
#hpop(number_of_columns = 1) ⇒ Matrix
Removes trailing columns from a Matrix (destructive).
80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/matrix_extensions.rb', line 80 def hpop(number_of_columns = 1) Matrix.Raise ErrDimensionMismatch unless number_of_columns < self.column_count dropped_columns = [] number_of_columns.times do dropped_column = [] @rows.each {|r| dropped_column << r.pop} dropped_columns << dropped_column end @column_count -= number_of_columns Matrix.columns(dropped_columns.reverse) end |
#vpop(number_of_rows = 1) ⇒ Matrix
Removes trailing rows from a Matrix (destructive).
98 99 100 101 102 103 104 105 |
# File 'lib/matrix_extensions.rb', line 98 def vpop(number_of_rows = 1) Matrix.Raise ErrDimensionMismatch unless number_of_rows < self.row_count dropped_rows = [] number_of_rows.times { dropped_rows.unshift @rows.pop } Matrix.rows(dropped_rows.reverse) end |