Rotate: Difference between revisions

Jump to navigation Jump to search
153 bytes added ,  21:27, 10 September 2022
m
Text replacement - "</source>" to "</syntaxhighlight>"
(→‎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>⌽</source>, which rotates along the last axis, while <source lang=apl inline>⊖</source>, 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>⊖</source> with the [[Rank operator]].
{{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>⌽</source> and <source lang=apl inline>⊖</source> with monadic functions [[Reverse]] and Reverse First, respectively.
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
</source>
</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
</source>
</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│
└────┴────┴────┘
└────┴────┴────┘
</source>
</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
</source>{{Works in|[[Dyalog APL]]}}
</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
</source>{{Works in|[[J]]}}
</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>⌽</source>, or the first axis for <source lang=apl inline>⊖</source>.
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</source> by <source lang=apl inline>X</source> units may be written in any APL, assuming <source lang=apl inline>⎕IO←0</source>, as <source lang=apl inline>Y[(⍴Y)|X+⍳⍴Y]</source>. To rotate an arbitrary array [[Squad indexing]] with axis (or [[Rank operator|rank]]) is helpful.
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
}
}
</source>
</syntaxhighlight>


== External links ==
== External links ==

Navigation menu