diff options
author | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-12-19 11:37:41 +0000 |
---|---|---|
committer | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-12-19 11:37:41 +0000 |
commit | 096845e09f2a41943d97bbab3bb58d171679eaa2 (patch) | |
tree | 2da96933c7d0ba4d6cc44b41e143d323016d3241 /lib/matrix.rb | |
parent | 4cc4a7749c8d2fd72c0542c56977d9f89c01181c (diff) | |
download | ruby-096845e09f2a41943d97bbab3bb58d171679eaa2.tar.gz ruby-096845e09f2a41943d97bbab3bb58d171679eaa2.tar.xz ruby-096845e09f2a41943d97bbab3bb58d171679eaa2.zip |
merges r20859 from trunk into ruby_1_9_1.
* lib/optparse/version.rb: remove variable shadowing to stop
warning. [ruby-core:20612]
* lib/irb/completion.rb, lib/net/imap.rb, lib/prime.rb,
lib/rinda/ring.rb, lib/racc/parser.rb,
lib/shell/command-processor.rb, lib/yaml/yamlnode.rb: ditto.
* lib/racc/parser.rb: remove space before parentheses.
* lib/shell/command-processor.rb, lib/shell/process-controller.rb:
use parentheses around arguments.
* lib/irb/ext/change-ws.rb, lib/rexml/validation/relaxng.rb,
lib/yaml/baseemitter.rb: indentation fix.
* lib/matrix.rb: small cosmetic change.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_9_1@20880 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/matrix.rb')
-rw-r--r-- | lib/matrix.rb | 132 |
1 files changed, 54 insertions, 78 deletions
diff --git a/lib/matrix.rb b/lib/matrix.rb index 229e51e5b..ec03c730f 100644 --- a/lib/matrix.rb +++ b/lib/matrix.rb @@ -140,10 +140,8 @@ class Matrix # # def Matrix.columns(columns) - rows = (0 .. columns[0].size - 1).collect { - |i| - (0 .. columns.size - 1).collect { - |j| + rows = (0 .. columns[0].size - 1).collect {|i| + (0 .. columns.size - 1).collect {|j| columns[j][i] } } @@ -159,8 +157,7 @@ class Matrix # def Matrix.diagonal(*values) size = values.size - rows = (0 .. size - 1).collect { - |j| + rows = (0 .. size - 1).collect {|j| row = Array.new(size).fill(0, 0, size) row[j] = values[j] row @@ -311,13 +308,11 @@ class Matrix # def column(j) # :yield: e if block_given? - 0.upto(row_size - 1) do - |i| + 0.upto(row_size - 1) do |i| yield @rows[i][j] end else - col = (0 .. row_size - 1).collect { - |i| + col = (0 .. row_size - 1).collect {|i| @rows[i][j] } Vector.elements(col, false) @@ -364,8 +359,7 @@ class Matrix Matrix.Raise ArgumentError, param.inspect end - rows = @rows[from_row, size_row].collect{ - |row| + rows = @rows[from_row, size_row].collect{|row| row[from_col, size_col] } Matrix.rows(rows, false) @@ -421,8 +415,7 @@ class Matrix def compare_by_row_vectors(rows, comparison = :==) return false unless @rows.size == rows.size - 0.upto(@rows.size - 1) do - |i| + 0.upto(@rows.size - 1) do |i| return false unless @rows[i].send(comparison, rows[i]) end true @@ -462,10 +455,8 @@ class Matrix def *(m) # m is matrix or vector or number case(m) when Numeric - rows = @rows.collect { - |row| - row.collect { - |e| + rows = @rows.collect {|row| + row.collect {|e| e * m } } @@ -477,13 +468,10 @@ class Matrix when Matrix Matrix.Raise ErrDimensionMismatch if column_size != m.row_size - rows = (0 .. row_size - 1).collect { - |i| - (0 .. m.column_size - 1).collect { - |j| + rows = (0 .. row_size - 1).collect {|i| + (0 .. m.column_size - 1).collect {|j| vij = 0 - 0.upto(column_size - 1) do - |k| + 0.upto(column_size - 1) do |k| vij += self[i, k] * m[k, j] end vij @@ -516,10 +504,8 @@ class Matrix Matrix.Raise ErrDimensionMismatch unless row_size == m.row_size and column_size == m.column_size - rows = (0 .. row_size - 1).collect { - |i| - (0 .. column_size - 1).collect { - |j| + rows = (0 .. row_size - 1).collect {|i| + (0 .. column_size - 1).collect {|j| self[i, j] + m[i, j] } } @@ -546,10 +532,8 @@ class Matrix Matrix.Raise ErrDimensionMismatch unless row_size == m.row_size and column_size == m.column_size - rows = (0 .. row_size - 1).collect { - |i| - (0 .. column_size - 1).collect { - |j| + rows = (0 .. row_size - 1).collect {|i| + (0 .. column_size - 1).collect {|j| self[i, j] - m[i, j] } } @@ -565,10 +549,8 @@ class Matrix def /(other) case other when Numeric - rows = @rows.collect { - |row| - row.collect { - |e| + rows = @rows.collect {|row| + row.collect {|e| e / other } } @@ -603,7 +585,7 @@ class Matrix for k in 0..size i = k akk = a[k][k].abs - for j in (k+1)..size + ((k+1)..size).each do |j| v = a[j][k].abs if v > akk i = j @@ -697,12 +679,13 @@ class Matrix det = 1 k = 0 - begin + loop do if (akk = a[k][k]) == 0 i = k - begin - return 0 if (i += 1) > size - end while a[i][k] == 0 + loop do + return 0 if (ii += 1) > size + break unless a[i][k] == 0 + end a[i], a[k] = a[k], a[i] akk = a[k][k] det *= -1 @@ -710,13 +693,13 @@ class Matrix for i in k + 1 .. size q = a[i][k].quo(akk) - (k + 1).upto(size) do - |j| + (k + 1).upto(size) do |j| a[i][j] -= a[k][j] * q end end det *= akk - end while (k += 1) <= size + break unless (k += 1) <= size + end det end alias det determinant @@ -739,12 +722,13 @@ class Matrix det = 1 k = 0 - begin + loop do if a[k][k].zero? i = k - begin + loop do return 0 if (i += 1) > size - end while a[i][k].zero? + break unless a[i][k].zero? + end a[i], a[k] = a[k], a[i] det *= -1 end @@ -761,7 +745,8 @@ class Matrix end end det *= a[k][k] - end while (k += 1) <= size + break unless (k += 1) <= size + end det end alias det_e determinant_e @@ -786,31 +771,32 @@ class Matrix end rank = 0 k = 0 - begin + loop do if (akk = a[k][k]) == 0 i = k exists = true - begin + loop do if (i += 1) > a_column_size - 1 exists = false break end - end while a[i][k] == 0 + break unless a[i][k] == 0 + end if exists a[i], a[k] = a[k], a[i] akk = a[k][k] else i = k exists = true - begin + loop do if (i += 1) > a_row_size - 1 exists = false break end - end while a[k][i] == 0 + break unless a[k][i] == 0 + end if exists - k.upto(a_column_size - 1) do - |j| + k.upto(a_column_size - 1) do |j| a[j][k], a[j][i] = a[j][i], a[j][k] end akk = a[k][k] @@ -827,7 +813,8 @@ class Matrix end end rank += 1 - end while (k += 1) <= a_column_size - 1 + break unless (k += 1) <= a_column_size - 1 + end return rank end @@ -873,8 +860,7 @@ class Matrix # def trace tr = 0 - 0.upto(column_size - 1) do - |i| + 0.upto(column_size - 1) do |i| tr += @rows[i][i] end tr @@ -916,8 +902,7 @@ class Matrix # Returns an array of the row vectors of the matrix. See Vector. # def row_vectors - rows = (0 .. row_size - 1).collect { - |i| + rows = (0 .. row_size - 1).collect {|i| row(i) } rows @@ -927,8 +912,7 @@ class Matrix # Returns an array of the column vectors of the matrix. See Vector. # def column_vectors - columns = (0 .. column_size - 1).collect { - |i| + columns = (0 .. column_size - 1).collect {|i| column(i) } columns @@ -961,8 +945,7 @@ class Matrix # Overrides Object#to_s # def to_s - "Matrix[" + @rows.collect{ - |row| + "Matrix[" + @rows.collect{|row| "[" + row.collect{|e| e.to_s}.join(", ") + "]" }.join(", ")+"]" end @@ -1169,8 +1152,7 @@ class Vector # def each2(v) # :yield: e1, e2 Vector.Raise ErrDimensionMismatch if size != v.size - 0.upto(size - 1) do - |i| + 0.upto(size - 1) do |i| yield @elements[i], v[i] end end @@ -1181,8 +1163,7 @@ class Vector # def collect2(v) # :yield: e1, e2 Vector.Raise ErrDimensionMismatch if size != v.size - (0 .. size - 1).collect do - |i| + (0 .. size - 1).collect do |i| yield @elements[i], v[i] end end @@ -1253,8 +1234,7 @@ class Vector case v when Vector Vector.Raise ErrDimensionMismatch if size != v.size - els = collect2(v) { - |v1, v2| + els = collect2(v) {|v1, v2| v1 + v2 } Vector.elements(els, false) @@ -1273,8 +1253,7 @@ class Vector case v when Vector Vector.Raise ErrDimensionMismatch if size != v.size - els = collect2(v) { - |v1, v2| + els = collect2(v) {|v1, v2| v1 - v2 } Vector.elements(els, false) @@ -1298,8 +1277,7 @@ class Vector Vector.Raise ErrDimensionMismatch if size != v.size p = 0 - each2(v) { - |v1, v2| + each2(v) {|v1, v2| p += v1 * v2 } p @@ -1309,8 +1287,7 @@ class Vector # Like Array#collect. # def collect # :yield: e - els = @elements.collect { - |v| + els = @elements.collect {|v| yield v } Vector.elements(els, false) @@ -1321,8 +1298,7 @@ class Vector # Like Vector#collect2, but returns a Vector instead of an Array. # def map2(v) # :yield: e1, e2 - els = collect2(v) { - |v1, v2| + els = collect2(v) {|v1, v2| yield v1, v2 } Vector.elements(els, false) |