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:
parent
3cb038cc7a
commit
07fd6dc49b
1 changed files with 12 additions and 10 deletions
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue