Feature #10059 » using_define_method_for_Vector_arithmetic.patch
lib/matrix.rb | ||
---|---|---|
1707 | 1707 |
end |
1708 | 1708 | |
1709 | 1709 |
# |
1710 |
# Vector addition. |
|
1710 |
# Vector addition and subtraction.
|
|
1711 | 1711 |
# |
1712 |
def +(v) |
|
1713 |
case v |
|
1714 |
when Vector |
|
1715 |
Vector.Raise ErrDimensionMismatch if size != v.size |
|
1716 |
els = collect2(v) {|v1, v2| |
|
1717 |
v1 + v2 |
|
1718 |
} |
|
1719 |
self.class.elements(els, false) |
|
1720 |
when Matrix |
|
1721 |
Matrix.column_vector(self) + v |
|
1722 |
else |
|
1723 |
apply_through_coercion(v, __method__) |
|
1724 |
end |
|
1725 |
end |
|
1726 | ||
1727 |
# |
|
1728 |
# Vector subtraction. |
|
1729 |
# |
|
1730 |
def -(v) |
|
1731 |
case v |
|
1732 |
when Vector |
|
1733 |
Vector.Raise ErrDimensionMismatch if size != v.size |
|
1734 |
els = collect2(v) {|v1, v2| |
|
1735 |
v1 - v2 |
|
1736 |
} |
|
1737 |
self.class.elements(els, false) |
|
1738 |
when Matrix |
|
1739 |
Matrix.column_vector(self) - v |
|
1740 |
else |
|
1741 |
apply_through_coercion(v, __method__) |
|
1712 |
%i(+ -).each do |op| |
|
1713 |
define_method(op) do |v| |
|
1714 |
case v |
|
1715 |
when Vector |
|
1716 |
Vector.Raise ErrDimensionMismatch unless size == v.size |
|
1717 |
els = collect2(v) {|v1, v2| |
|
1718 |
v1.send(op, v2) |
|
1719 |
} |
|
1720 |
self.class.elements(els, false) |
|
1721 |
when Matrix |
|
1722 |
Matrix.column_vector(self).send(op, v) |
|
1723 |
else |
|
1724 |
apply_through_coercion(v, op) |
|
1725 |
end |
|
1742 | 1726 |
end |
1743 | 1727 |
end |
1744 | 1728 |