Ravel: Difference between revisions

Jump to navigation Jump to search
m
Miraheze>Marshall
 
(19 intermediate revisions by 5 users not shown)
Line 1: Line 1:
In the APL [[array model]], an array's ravel is the [[vector]] containing all its [[elements]] in [[ravel order]]. The Ravel function, which was introduced in [[APL\360]] and is universally spelled <code>,</code>, returns the ravel of an array. It is equivalent to [[Reshape|reshaping]] an array using its [[bound]] for the new [[shape]]. Reshaping the ravel using the original array's shape restores that array.
{{Built-in|Ravel|,}} is a [[primitive function]] introduced in [[APL\360]] which returns the ''ravel'' of an array. In the APL [[array model]], an array's ravel is the [[vector]] containing all its [[elements]] in [[ravel order]]. It is equivalent to [[Reshape|reshaping]] an array using its [[bound]] for the new [[shape]]. Reshaping the ravel using the original array's shape restores that array.


In some APLs an [[Function axis|axis]] may be specified for Ravel in order to combine only some [[Axis|axes]] of an array, or insert a length-1 axis.
In some APLs an [[Function axis|axis]] may be specified for Ravel in order to combine only some [[Axis|axes]] of an array, or insert a length-1 axis.


The name "ravel" is references the process of undoing woven or knitted fabric, thus removing its structure and rendering it linear.
The name "ravel" references the process of undoing woven or knitted fabric, thus removing its structure and rendering it linear.


== Examples ==
== Examples ==


You can use ravel to squash a [[matrix]] down to one dimension. The elements are listed in reading order—left to right, top to bottom.
You can use ravel to squash a [[matrix]] down to one dimension. The elements are listed in reading order—left to right, top to bottom.
<source class=apl>
<syntaxhighlight lang=apl>
       ⊢x ← 3 4⍴⍳12            ⍝ A matrix
       ⎕←x ← 3 4⍴⍳12            ⍝ A matrix
1  2  3  4
1  2  3  4
5  6  7  8
5  6  7  8
Line 19: Line 19:
       (,×/⍴x) ≡ ⍴,x          ⍝ Or the product of the original shape
       (,×/⍴x) ≡ ⍴,x          ⍝ Or the product of the original shape
1
1
</source>
</syntaxhighlight>


Ravelling a [[scalar]] yields a [[singleton]] [[vector]].
Ravelling a [[scalar]] yields a [[singleton]] [[vector]].
<source class=apl>
<syntaxhighlight lang=apl>
       ,3
       ,3
3
3
Line 29: Line 29:
       ⍴,3                    ⍝ It's now a vector
       ⍴,3                    ⍝ It's now a vector
1
1
</source>
</syntaxhighlight>


[[String]] notation cannot produce a single-character string since it produces a [[scalar]] character instead. Using Ravel on a list of characters in quotes ensures it will be a [[vector]] of characters.
[[String]] notation cannot produce a single-character string since it produces a [[scalar]] character instead. Using Ravel on a list of characters in quotes ensures it will be a [[vector]] of characters.
<source class=apl>
<syntaxhighlight lang=apl>
       ≢⍴ 'a'                  ⍝ Scalar character
       ≢⍴ 'a'                  ⍝ Scalar character
0
0
       ≢⍴ ,'a'                ⍝ String
       ≢⍴ ,'a'                ⍝ String
1
1
</source>
</syntaxhighlight>
 
=== With axis ===
[[Function axis|Axis specification]] may accept either a [[vector]] of two or more adjacent [[axis]] [[Index|indices]], or a single non-integer value. If multiple axes are given, they are merged into one axis whose length is the product of their lengths. If only one value is given, a new axis of length 1 is inserted in the indicated "gap" between axes.
[[Function axis|Axis specification]] may accept either a [[vector]] of two or more adjacent [[axis]] [[Index|indices]], or a single non-integer value. If multiple axes are given, they are merged into one axis whose length is the product of their lengths. If only one value is given, a new axis of length 1 is inserted in the indicated "gap" between axes.
<source class=apl>
<syntaxhighlight lang=apl>
       ⍴ ,[2 3] 5 4 3 2⍴0
       ⍴ ,[2 3] 5 4 3 2⍴0
5 12 2
5 12 2
       ⍴ ,[2.5] 5 4 3 2⍴0
       ⍴ ,[2.5] 5 4 3 2⍴0
5 4 1 3 2
5 4 1 3 2
</source>
</syntaxhighlight>
{{Works in|[[Dyalog APL]]}}
{{Works in|[[Dyalog APL]]}}


== Description ==
== Description ==


The ravel of an array <code>A</code> has shape <code>,×/⍴A</code> and shares elements with <code>A</code>. Thus Ravel may be modelled as a [[Reshape|reshaping]] function <code>{(×/⍴⍵)⍴⍵}</code>. The [[element]] with [[index]] [[vector]] <code>I</code> is moved to index <code>(⍴A)⊥I</code> in [[index origin]] 0, or <code>⎕IO+(⍴A)⊥I-⎕IO</code> in arbitrary index origin.
The ravel of an array <syntaxhighlight lang=apl inline>A</syntaxhighlight> has shape <syntaxhighlight lang=apl inline>,×/⍴A</syntaxhighlight> and shares elements with <syntaxhighlight lang=apl inline>A</syntaxhighlight>. Thus Ravel may be modelled as a [[Reshape|reshaping]] function <syntaxhighlight lang=apl inline>{(×/⍴⍵)⍴⍵}</syntaxhighlight>. The [[element]] with [[index]] [[vector]] <syntaxhighlight lang=apl inline>I</syntaxhighlight> is moved to index <syntaxhighlight lang=apl inline>(⍴A)⊥I</syntaxhighlight> in [[index origin]] 0, or <syntaxhighlight lang=apl inline>⎕IO+(⍴A)⊥I-⎕IO</syntaxhighlight> in arbitrary index origin.


As with any reshaping, the result of Ravel has the same [[prototype]] as the argument.
As with any reshaping, the result of Ravel has the same [[prototype]] as the argument.
Line 58: Line 58:
Ravel was present in the first version of [[APL\360]]<ref>Falkoff, A.D., and K.E. Iverson. [https://www.jsoftware.com/papers/APL360TerminalSystem.htm "The APL\360 Terminal System"]. Research Report RC-1922, IBM, 1967-10-16.</ref> and has been included in every APL since.
Ravel was present in the first version of [[APL\360]]<ref>Falkoff, A.D., and K.E. Iverson. [https://www.jsoftware.com/papers/APL360TerminalSystem.htm "The APL\360 Terminal System"]. Research Report RC-1922, IBM, 1967-10-16.</ref> and has been included in every APL since.


== Documentation ==
== See also ==
* [[Enlist]]
 
== External links ==
 
=== Lessons ===
 
* [https://chat.stackexchange.com/transcript/52405?m=41726592#41726592 APL Cultivation]
 
=== Documentation ===
 
* [https://help.dyalog.com/latest/index.htm#Language/Primitive%20Functions/Ravel.htm Dyalog] ([https://help.dyalog.com/latest/index.htm#Language/Primitive%20Functions/Ravel%20with%20Axes.htm with axis]),


[http://help.dyalog.com/latest/Content/Language/Primitive%20Functions/Ravel.htm Dyalog] [http://help.dyalog.com/latest/Content/Language/Primitive%20Functions/Ravel%20with%20Axes.htm with axis]
* [http://wiki.nars2000.org/index.php/Rho NARS2000]


J [https://www.jsoftware.com/help/dictionary/d320.htm Dictionary], [https://code.jsoftware.com/wiki/Vocabulary/comma NuVoc]  
* [http://microapl.com/apl_help/ch_020_020_480.htm APLX]


== Other Resources ==
* [https://www.jsoftware.com/help/dictionary/d320.htm J Dictionary], [https://code.jsoftware.com/wiki/Vocabulary/comma J NuVoc]


[https://chat.stackexchange.com/transcript/52405?m=41726592#41726592 APL Cultivation]
* [https://mlochbaum.github.io/BQN/doc/reshape.html BQN] (as Deshape)


== References ==
== References ==
Line 72: Line 83:
<references />
<references />


{{APL programming language}}
{{APL features}}
{{APL built-ins}}[[Category:Primitive functions]]

Navigation menu