1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

[ruby/matrix] Optimize Matrix#*

This commit is contained in:
Marc-Andre Lafortune 2020-04-30 17:04:46 -04:00
parent 3cb038cc7a
commit 07fd6dc49b

View file

@ -1057,25 +1057,27 @@ class Matrix
def *(m) # m is matrix or vector or number def *(m) # m is matrix or vector or number
case(m) case(m)
when Numeric when Numeric
rows = @rows.collect {|row| new_rows = @rows.collect {|row|
row.collect {|e| e * m } row.collect {|e| e * m }
} }
return new_matrix rows, column_count return new_matrix new_rows, column_count
when Vector when Vector
m = self.class.column_vector(m) m = self.class.column_vector(m)
r = self * m r = self * m
return r.column(0) return r.column(0)
when Matrix when Matrix
raise ErrDimensionMismatch if column_count != m.row_count raise ErrDimensionMismatch if column_count != m.row_count
m_rows = m.rows
rows = Array.new(row_count) {|i| new_rows = rows.map do |row_i|
Array.new(m.column_count) {|j| Array.new(m.column_count) do |j|
(0 ... column_count).inject(0) do |vij, k| vij = 0
vij + self[i, k] * m[k, j] column_count.times do |k|
vij += row_i[k] * m_rows[k][j]
end end
} vij
} end
return new_matrix rows, m.column_count end
return new_matrix new_rows, m.column_count
else else
return apply_through_coercion(m, __method__) return apply_through_coercion(m, __method__)
end end