4,494
edits
(→Documentation: BQN link) |
m (Text replacement - "</source>" to "</syntaxhighlight>") |
||
Line 1: | Line 1: | ||
{{Built-ins|Rotate|⌽|⊖}} is a [[dyadic]] [[primitive function]] which "rotates" the [[elements]] of the right [[argument]] around a specified [[axis]]. The name Rotate is typically used for the primitive <source lang=apl inline>⌽</ | {{Built-ins|Rotate|⌽|⊖}} is a [[dyadic]] [[primitive function]] which "rotates" the [[elements]] of the right [[argument]] around a specified [[axis]]. The name Rotate is typically used for the primitive <source lang=apl inline>⌽</syntaxhighlight>, which rotates along the last axis, while <source lang=apl inline>⊖</syntaxhighlight>, which rotates along the first axis, is called "Rotate First" or similar. APLs with [[function axis]] allow to choose a different axis from the default one. In the [[leading axis model]], specifying an axis is discouraged in favor of using <source lang=apl inline>⊖</syntaxhighlight> with the [[Rank operator]]. | ||
Rotate and Rotate First share the [[glyph|glyphs]] <source lang=apl inline>⌽</ | Rotate and Rotate First share the [[glyph|glyphs]] <source lang=apl inline>⌽</syntaxhighlight> and <source lang=apl inline>⊖</syntaxhighlight> with monadic functions [[Reverse]] and Reverse First, respectively. | ||
== Examples == | == Examples == | ||
Line 14: | Line 14: | ||
¯4⌽1 2 3 4 5 6 7 | ¯4⌽1 2 3 4 5 6 7 | ||
4 5 6 7 1 2 3 | 4 5 6 7 1 2 3 | ||
</ | </syntaxhighlight> | ||
Rotate on a [[matrix]] rotates the elements around horizontally (to the left), while Rotate First does vertically (upwards). | Rotate on a [[matrix]] rotates the elements around horizontally (to the left), while Rotate First does vertically (upwards). | ||
Line 31: | Line 31: | ||
IJKL | IJKL | ||
ABCD | ABCD | ||
</ | </syntaxhighlight> | ||
Higher-[[rank]] arrays can be rotated on an arbitrary axis if [[function axis]] or [[Rank operator]] is supported: | Higher-[[rank]] arrays can be rotated on an arbitrary axis if [[function axis]] or [[Rank operator]] is supported: | ||
Line 64: | Line 64: | ||
│IJKL│MNOP│VWXU│ | │IJKL│MNOP│VWXU│ | ||
└────┴────┴────┘ | └────┴────┴────┘ | ||
</ | </syntaxhighlight> | ||
Usage of non-scalar X differs between implementations. [[Dyalog APL]] allows to specify different amount of rotation for different "columns" or 1-dimensional [[subarray|subarrays]] which Rotate is applied to. [[J]] allows to specify rotations for multiple leading axes at once. | Usage of non-scalar X differs between implementations. [[Dyalog APL]] allows to specify different amount of rotation for different "columns" or 1-dimensional [[subarray|subarrays]] which Rotate is applied to. [[J]] allows to specify rotations for multiple leading axes at once. | ||
Line 77: | Line 77: | ||
4 1 2 3 | 4 1 2 3 | ||
3 4 1 2 | 3 4 1 2 | ||
</ | </syntaxhighlight>{{Works in|[[Dyalog APL]]}} | ||
<source lang=j> | <source lang=j> | ||
Line 88: | Line 88: | ||
10 11 8 9 | 10 11 8 9 | ||
2 3 0 1 | 2 3 0 1 | ||
</ | </syntaxhighlight>{{Works in|[[J]]}} | ||
== Description == | == Description == | ||
Line 94: | Line 94: | ||
In languages with [[function axis]], exactly one argument axis may be specified. | In languages with [[function axis]], exactly one argument axis may be specified. | ||
Rotating a [[scalar]] always yields that scalar unchanged. Otherwise, Rotate operates on a particular axis of its right argument. This axis is the specified axis if one is given, and otherwise the last axis for <source lang=apl inline>⌽</ | Rotating a [[scalar]] always yields that scalar unchanged. Otherwise, Rotate operates on a particular axis of its right argument. This axis is the specified axis if one is given, and otherwise the last axis for <source lang=apl inline>⌽</syntaxhighlight>, or the first axis for <source lang=apl inline>⊖</syntaxhighlight>. | ||
The result array has the same [[shape]] and [[elements]] as the right argument array, but the elements cyclically move around the rotation axis. Consequently if the length of this axis is 0 or 1 then rotation has no effect. | The result array has the same [[shape]] and [[elements]] as the right argument array, but the elements cyclically move around the rotation axis. Consequently if the length of this axis is 0 or 1 then rotation has no effect. | ||
Line 100: | Line 100: | ||
=== APL model === | === APL model === | ||
The rotation of a vector <source lang=apl inline>Y</ | The rotation of a vector <source lang=apl inline>Y</syntaxhighlight> by <source lang=apl inline>X</syntaxhighlight> units may be written in any APL, assuming <source lang=apl inline>⎕IO←0</syntaxhighlight>, as <source lang=apl inline>Y[(⍴Y)|X+⍳⍴Y]</syntaxhighlight>. To rotate an arbitrary array [[Squad indexing]] with axis (or [[Rank operator|rank]]) is helpful. | ||
<source lang=apl> | <source lang=apl> | ||
RotateAxis ← { ⍝ R ← X (K RotateAxis) Y | RotateAxis ← { ⍝ R ← X (K RotateAxis) Y | ||
Line 108: | Line 108: | ||
(⊂l|⍺+⍳l) ⌷[⍺⍺] ⍵ ⍝ Rotate with indexing | (⊂l|⍺+⍳l) ⌷[⍺⍺] ⍵ ⍝ Rotate with indexing | ||
} | } | ||
</ | </syntaxhighlight> | ||
== External links == | == External links == |