[ruby/matrix] Add Matrix#rotate_entries [#19]

Co-authored-by: Marc-André Lafortune <github@marc-andre.ca>
This commit is contained in:
Felix Wolfsteller 2020-12-21 18:28:55 +01:00 committed by Marc-Andre Lafortune
parent 0130e17a41
commit e34f51fe60
2 changed files with 85 additions and 0 deletions

View file

@ -1458,6 +1458,35 @@ class Matrix
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)
#