mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* lib/matrix.rb: Optimizations
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@24970 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
684115fa9c
commit
b9c7e6b049
2 changed files with 25 additions and 39 deletions
|
@ -1,3 +1,7 @@
|
||||||
|
Thu Sep 17 06:19:27 2009 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
|
||||||
|
|
||||||
|
* lib/matrix.rb: Optimizations
|
||||||
|
|
||||||
Wed Sep 16 17:25:43 2009 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
|
Wed Sep 16 17:25:43 2009 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
|
||||||
|
|
||||||
* lib/matrix.rb (Matrix#/): Fix was is obviously a bug
|
* lib/matrix.rb (Matrix#/): Fix was is obviously a bug
|
||||||
|
|
|
@ -316,8 +316,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
|
||||||
|
@ -454,11 +454,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)
|
||||||
|
@ -662,10 +660,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|
|
||||||
begin
|
a[i][k] != 0
|
||||||
return 0 if (i += 1) >= size
|
}
|
||||||
end while a[i][k] == 0
|
return 0 if i.nil?
|
||||||
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
|
||||||
|
@ -703,35 +701,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
|
||||||
begin
|
}
|
||||||
if (i += 1) >= a_row_size
|
next if i.nil?
|
||||||
exists = false
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end while a[k][i] == 0
|
|
||||||
if exists
|
|
||||||
(k ... a_column_size).each do |j|
|
(k ... a_column_size).each do |j|
|
||||||
a[j][k], a[j][i] = a[j][i], a[j][k]
|
a[j][k], a[j][i] = a[j][i], a[j][k]
|
||||||
end
|
end
|
||||||
akk = a[k][k]
|
akk = a[k][k]
|
||||||
else
|
|
||||||
next
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -752,11 +736,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
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue