зеркало из https://github.com/github/ruby.git
* 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:
Родитель
56070dbb56
Коммит
d09cde1861
|
@ -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>
|
||||
|
||||
* time.c (time_mdump): error message refined.
|
||||
|
|
|
@ -322,8 +322,8 @@ class Matrix
|
|||
# => 1 4
|
||||
# 9 16
|
||||
#
|
||||
def collect # :yield: e
|
||||
rows = @rows.collect{|row| row.collect{|e| yield e}}
|
||||
def collect(&block) # :yield: e
|
||||
rows = @rows.collect{|row| row.collect(&block)}
|
||||
Matrix.rows(rows, false)
|
||||
end
|
||||
alias map collect
|
||||
|
@ -457,11 +457,9 @@ class Matrix
|
|||
|
||||
rows = (0 ... row_size).collect {|i|
|
||||
(0 ... m.column_size).collect {|j|
|
||||
vij = 0
|
||||
column_size.times do |k|
|
||||
vij += self[i, k] * m[k, j]
|
||||
(0 ... column_size).inject(0) do |vij, k|
|
||||
vij + self[i, k] * m[k, j]
|
||||
end
|
||||
vij
|
||||
}
|
||||
}
|
||||
return Matrix.rows(rows, false)
|
||||
|
@ -667,11 +665,10 @@ class Matrix
|
|||
det = 1
|
||||
size.times do |k|
|
||||
if (akk = a[k][k]) == 0
|
||||
i = k
|
||||
loop do
|
||||
return 0 if (i += 1) >= size
|
||||
break unless a[i][k] == 0
|
||||
end
|
||||
i = (k+1 ... size).find {|i|
|
||||
a[i][k] != 0
|
||||
}
|
||||
return 0 if i.nil?
|
||||
a[i], a[k] = a[k], a[i]
|
||||
akk = a[k][k]
|
||||
det *= -1
|
||||
|
@ -708,11 +705,10 @@ class Matrix
|
|||
det = 1
|
||||
size.times do |k|
|
||||
if a[k][k].zero?
|
||||
i = k
|
||||
loop do
|
||||
return 0 if (i += 1) >= size
|
||||
break unless a[i][k].zero?
|
||||
end
|
||||
i = (k+1 ... size).find {|i|
|
||||
a[i][k] != 0
|
||||
}
|
||||
return 0 if i.nil?
|
||||
a[i], a[k] = a[k], a[i]
|
||||
det *= -1
|
||||
end
|
||||
|
@ -755,36 +751,21 @@ class Matrix
|
|||
rank = 0
|
||||
a_column_size.times do |k|
|
||||
if (akk = a[k][k]) == 0
|
||||
i = k
|
||||
exists = true
|
||||
loop do
|
||||
if (i += 1) >= a_column_size
|
||||
exists = false
|
||||
break
|
||||
end
|
||||
break unless a[i][k] == 0
|
||||
end
|
||||
if exists
|
||||
i = (k+1 ... a_column_size).find {|i|
|
||||
a[i][k] != 0
|
||||
}
|
||||
if i
|
||||
a[i], a[k] = a[k], a[i]
|
||||
akk = a[k][k]
|
||||
else
|
||||
i = k
|
||||
exists = true
|
||||
loop do
|
||||
if (i += 1) >= a_row_size
|
||||
exists = false
|
||||
break
|
||||
end
|
||||
break unless a[k][i] == 0
|
||||
end
|
||||
if exists
|
||||
i = (k+1 ... a_row_size).find {|i|
|
||||
a[k][i] != 0
|
||||
}
|
||||
next if i.nil?
|
||||
(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
|
||||
end
|
||||
|
||||
|
@ -840,11 +821,9 @@ class Matrix
|
|||
# => 16
|
||||
#
|
||||
def trace
|
||||
tr = 0
|
||||
column_size.times do |i|
|
||||
tr += @rows[i][i]
|
||||
(0...column_size).inject(0) do |tr, i|
|
||||
tr + @rows[i][i]
|
||||
end
|
||||
tr
|
||||
end
|
||||
alias tr trace
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче