lib/matrix.rb in matrix-0.3.1 vs lib/matrix.rb in matrix-0.4.0
- old
+ new
@@ -1456,9 +1456,38 @@
def rank_e
warn "Matrix#rank_e is deprecated; use #rank", uplevel: 1
rank
end
+ #
+ # Returns a new matrix with rotated elements.
+ # The argument specifies the rotation (defaults to `:clockwise`):
+ # * :clockwise, 1, -3, etc.: "turn right" - first row becomes last column
+ # * :half_turn, 2, -2, etc.: first row becomes last row, elements in reverse order
+ # * :counter_clockwise, -1, 3: "turn left" - first row becomes first column
+ # (but with elements in reverse order)
+ #
+ # m = Matrix[ [1, 2], [3, 4] ]
+ # r = m.rotate_entries(:clockwise)
+ # # => Matrix[[3, 1], [4, 2]]
+ #
+ def rotate_entries(rotation = :clockwise)
+ rotation %= 4 if rotation.respond_to? :to_int
+
+ case rotation
+ when 0
+ dup
+ when 1, :clockwise
+ new_matrix @rows.transpose.each(&:reverse!), row_count
+ when 2, :half_turn
+ new_matrix @rows.map(&:reverse).reverse!, column_count
+ when 3, :counter_clockwise
+ new_matrix @rows.transpose.reverse!, row_count
+ else
+ raise ArgumentError, "expected #{rotation.inspect} to be one of :clockwise, :counter_clockwise, :half_turn or an integer"
+ end
+ end
+
# Returns a matrix with entries rounded to the given precision
# (see Float#round)
#
def round(ndigits=0)
map{|e| e.round(ndigits)}