aboutsummaryrefslogtreecommitdiffstats
path: root/lib/matrix.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/matrix.rb')
-rw-r--r--lib/matrix.rb132
1 files changed, 54 insertions, 78 deletions
diff --git a/lib/matrix.rb b/lib/matrix.rb
index 229e51e5b7..ec03c730fa 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)