Ravel: Difference between revisions

Jump to navigation Jump to search
m
m (14 revisions imported: Migrate from miraheze)
 
(7 intermediate revisions by 2 users not shown)
Line 8: Line 8:


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 lang=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 lang=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 lang=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 lang=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 <source lang=apl inline>A</source> has shape <source lang=apl inline>,×/⍴A</source> and shares elements with <source lang=apl inline>A</source>. Thus Ravel may be modelled as a [[Reshape|reshaping]] function <source lang=apl inline>{(×/⍴⍵)⍴⍵}</source>. The [[element]] with [[index]] [[vector]] <source lang=apl inline>I</source> is moved to index <source lang=apl inline>(⍴A)⊥I</source> in [[index origin]] 0, or <source lang=apl inline>⎕IO+(⍴A)⊥I-⎕IO</source> 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 57: Line 57:


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.
== See also ==
* [[Enlist]]


== External links ==
== External links ==
Line 66: Line 69:
=== Documentation ===
=== Documentation ===


* [http://help.dyalog.com/latest/index.htm#Language/Primitive%20Functions/Ravel.htm Dyalog] ([http://help.dyalog.com/latest/index.htm#Language/Primitive%20Functions/Ravel%20with%20Axes.htm with axis]),
* [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://wiki.nars2000.org/index.php/Rho NARS2000]
* [http://wiki.nars2000.org/index.php/Rho NARS2000]
Line 73: Line 76:


* [https://www.jsoftware.com/help/dictionary/d320.htm J Dictionary], [https://code.jsoftware.com/wiki/Vocabulary/comma J NuVoc]
* [https://www.jsoftware.com/help/dictionary/d320.htm J Dictionary], [https://code.jsoftware.com/wiki/Vocabulary/comma J NuVoc]
* [https://mlochbaum.github.io/BQN/doc/reshape.html BQN] (as Deshape)


== References ==
== References ==
Line 79: Line 84:


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

Navigation menu