* lib/matrix.rb: Optimizations

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@24968 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
marcandre 2009-09-16 21:02:54 +00:00
Родитель 56070dbb56
Коммит d09cde1861
2 изменённых файлов: 29 добавлений и 46 удалений

Просмотреть файл

@ -1,3 +1,7 @@
Thu Sep 17 06:02:04 2009 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
* lib/matrix.rb: Optimizations
Thu Sep 17 00:36:01 2009 Tanaka Akira <akr@fsij.org> Thu Sep 17 00:36:01 2009 Tanaka Akira <akr@fsij.org>
* time.c (time_mdump): error message refined. * time.c (time_mdump): error message refined.

Просмотреть файл

@ -322,8 +322,8 @@ class Matrix
# => 1 4 # => 1 4
# 9 16 # 9 16
# #
def collect # :yield: e def collect(&block) # :yield: e
rows = @rows.collect{|row| row.collect{|e| yield e}} rows = @rows.collect{|row| row.collect(&block)}
Matrix.rows(rows, false) Matrix.rows(rows, false)
end end
alias map collect alias map collect
@ -457,11 +457,9 @@ class Matrix
rows = (0 ... row_size).collect {|i| rows = (0 ... row_size).collect {|i|
(0 ... m.column_size).collect {|j| (0 ... m.column_size).collect {|j|
vij = 0 (0 ... column_size).inject(0) do |vij, k|
column_size.times do |k| vij + self[i, k] * m[k, j]
vij += self[i, k] * m[k, j]
end end
vij
} }
} }
return Matrix.rows(rows, false) return Matrix.rows(rows, false)
@ -667,11 +665,10 @@ class Matrix
det = 1 det = 1
size.times do |k| size.times do |k|
if (akk = a[k][k]) == 0 if (akk = a[k][k]) == 0
i = k i = (k+1 ... size).find {|i|
loop do a[i][k] != 0
return 0 if (i += 1) >= size }
break unless a[i][k] == 0 return 0 if i.nil?
end
a[i], a[k] = a[k], a[i] a[i], a[k] = a[k], a[i]
akk = a[k][k] akk = a[k][k]
det *= -1 det *= -1
@ -708,11 +705,10 @@ class Matrix
det = 1 det = 1
size.times do |k| size.times do |k|
if a[k][k].zero? if a[k][k].zero?
i = k i = (k+1 ... size).find {|i|
loop do a[i][k] != 0
return 0 if (i += 1) >= size }
break unless a[i][k].zero? return 0 if i.nil?
end
a[i], a[k] = a[k], a[i] a[i], a[k] = a[k], a[i]
det *= -1 det *= -1
end end
@ -755,36 +751,21 @@ class Matrix
rank = 0 rank = 0
a_column_size.times do |k| a_column_size.times do |k|
if (akk = a[k][k]) == 0 if (akk = a[k][k]) == 0
i = k i = (k+1 ... a_column_size).find {|i|
exists = true a[i][k] != 0
loop do }
if (i += 1) >= a_column_size if i
exists = false
break
end
break unless a[i][k] == 0
end
if exists
a[i], a[k] = a[k], a[i] a[i], a[k] = a[k], a[i]
akk = a[k][k] akk = a[k][k]
else else
i = k i = (k+1 ... a_row_size).find {|i|
exists = true a[k][i] != 0
loop do }
if (i += 1) >= a_row_size next if i.nil?
exists = false (k ... a_column_size).each do |j|
break a[j][k], a[j][i] = a[j][i], a[j][k]
end
break unless a[k][i] == 0
end
if exists
(k ... a_column_size).each do |j|
a[j][k], a[j][i] = a[j][i], a[j][k]
end
akk = a[k][k]
else
next
end end
akk = a[k][k]
end end
end end
@ -840,11 +821,9 @@ class Matrix
# => 16 # => 16
# #
def trace def trace
tr = 0 (0...column_size).inject(0) do |tr, i|
column_size.times do |i| tr + @rows[i][i]
tr += @rows[i][i]
end end
tr
end end
alias tr trace alias tr trace