4,494
edits
m (Text replacement - "</source>" to "</syntaxhighlight>") |
|||
(One intermediate revision by the same user not shown) | |||
Line 1: | Line 1: | ||
In the APL [[array model]] and in particular [[leading axis theory]], a '''cell''' of an array is a [[subarray]] which is formed by selecting a single [[Index#Index along an axis|index]] along some number of leading [[Axis|axes]] and the whole of each trailing axis. Cells are classified by their [[rank]], which may be between 0 ([[scalar]]s) and the array's rank (in which case the cell must be the entire array). Cells with rank < | In the APL [[array model]] and in particular [[leading axis theory]], a '''cell''' of an array is a [[subarray]] which is formed by selecting a single [[Index#Index along an axis|index]] along some number of leading [[Axis|axes]] and the whole of each trailing axis. Cells are classified by their [[rank]], which may be between 0 ([[scalar]]s) and the array's rank (in which case the cell must be the entire array). Cells with rank <syntaxhighlight lang=apl inline>k</syntaxhighlight> are called '''k-cells''' of an array. A [[major cell]] is a cell whose rank is one less than the entire array, or a 0-cell of a [[scalar]]. | ||
== Characterization == | == Characterization == | ||
Line 10: | Line 10: | ||
</div> | </div> | ||
The k-cells of an array with [[rank]] < | The k-cells of an array with [[rank]] <syntaxhighlight lang=apl inline>r</syntaxhighlight> share the last <syntaxhighlight lang=apl inline>k</syntaxhighlight> [[Axis|axes]] with that array, and collapse the first <syntaxhighlight lang=apl inline>r-k</syntaxhighlight> axes by choosing a single [[Index#Index along an axis|index]] along each of them. Using [[bracket indexing]] this can be written | ||
< | <syntaxhighlight lang=apl> | ||
A[3;2; ; ; ] ⍝ 3-cell of a rank-5 array | A[3;2; ; ; ] ⍝ 3-cell of a rank-5 array | ||
</ | </syntaxhighlight> | ||
while [[Squad indexing]] allows a cell to be selected without knowing the argument's rank. | while [[Squad indexing]] allows a cell to be selected without knowing the argument's rank. | ||
< | <syntaxhighlight lang=apl> | ||
3 2⌷A ⍝ (r-2)-cell of a rank-r array | 3 2⌷A ⍝ (r-2)-cell of a rank-r array | ||
</ | </syntaxhighlight> | ||
</div> | </div> | ||
Squad indexing thus transforms [[vector]]s whose length is at most the [[rank]] of an array into cells of that array. This transformation is an exact correspondence or [[wikipedia:bijection|bijection]]: each cell has exactly one corresponding vector. For this reason a valid [[simple]] [[numeric]] left argument to Squad is called the [[Index#Index of a cell|index of a cell]]. | Squad indexing thus transforms [[vector]]s whose length is at most the [[rank]] of an array into cells of that array. This transformation is an exact correspondence or [[wikipedia:bijection|bijection]]: each cell has exactly one corresponding vector. For this reason a valid [[simple]] [[numeric]] left argument to Squad is called the [[Index#Index of a cell|index of a cell]]. | ||
Line 24: | Line 24: | ||
All cells of a given rank in a particular array have the same [[shape]]: | All cells of a given rank in a particular array have the same [[shape]]: | ||
< | <syntaxhighlight lang=apl> | ||
A ← 5 4 3 2⍴0 | A ← 5 4 3 2⍴0 | ||
(3 2)(1 4)(2 2)(4 4) {⍴⍺⌷⍵}¨⊂ A | (3 2)(1 4)(2 2)(4 4) {⍴⍺⌷⍵}¨⊂ A | ||
Line 30: | Line 30: | ||
│3 2│3 2│3 2│3 2│ | │3 2│3 2│3 2│3 2│ | ||
└───┴───┴───┴───┘ | └───┴───┴───┴───┘ | ||
</ | </syntaxhighlight> | ||
This is because the shape of a cell is always a [[suffix]] of the shape of the entire array. | This is because the shape of a cell is always a [[suffix]] of the shape of the entire array. | ||
< | <syntaxhighlight lang=apl> | ||
(4 3 2 1)(2 2)(5)(3 1)⍬ {⍴⍺⌷⍵}¨⊂ A | (4 3 2 1)(2 2)(5)(3 1)⍬ {⍴⍺⌷⍵}¨⊂ A | ||
┌┬───┬─────┬───┬───────┐ | ┌┬───┬─────┬───┬───────┐ | ||
││3 2│4 3 2│3 2│5 4 3 2│ | ││3 2│4 3 2│3 2│5 4 3 2│ | ||
└┴───┴─────┴───┴───────┘ | └┴───┴─────┴───┴───────┘ | ||
</ | </syntaxhighlight> | ||
Because there is only one possible shape for k-cells of an array < | Because there is only one possible shape for k-cells of an array <syntaxhighlight lang=apl inline>A</syntaxhighlight>, this shape is called the rank-k '''cell shape''' for <syntaxhighlight lang=apl inline>A</syntaxhighlight>. The cell shape is an important feature of the [[Rank operator]]: every invocation of Rank's left [[operand]] receives arrays of the same shape as [[argument]]s. | ||
== Leading and trailing axes == | == Leading and trailing axes == | ||
Line 51: | Line 51: | ||
== Hierarchy == | == Hierarchy == | ||
In an array of rank < | In an array of rank <syntaxhighlight lang=apl inline>r</syntaxhighlight>, every cell of rank <syntaxhighlight lang=apl inline>k</syntaxhighlight> is contained in exactly one cell of rank <syntaxhighlight lang=apl inline>j</syntaxhighlight> when <math>r \ge j \ge k \ge 0</math>. In particular, every 0-cell (and hence every [[element]]) is contained in exactly one cell of each rank. This is why the interactive tool at the right can display cells of three different ranks even though only a single element can be pointed at. | ||
Considering cells in terms of their [[Index#Index of a cell|indices]] makes the reason for this relationship clear. In an array of rank < | Considering cells in terms of their [[Index#Index of a cell|indices]] makes the reason for this relationship clear. In an array of rank <syntaxhighlight lang=apl inline>r</syntaxhighlight>, a cell of rank <syntaxhighlight lang=apl inline>k</syntaxhighlight> has an index vector <syntaxhighlight lang=apl inline>I</syntaxhighlight> of length <syntaxhighlight lang=apl inline>r-k</syntaxhighlight> (the index selects one index along each axis ''not'' in the cell). For <syntaxhighlight lang=apl inline>j</syntaxhighlight> such that <math>r \ge j \ge k</math>, we have <math>r-j \le r-k</math>, and the cell of rank <syntaxhighlight lang=apl inline>j</syntaxhighlight> which contains our chosen cell has index <syntaxhighlight lang=apl inline>(r-j)↑I</syntaxhighlight>, a [[prefix]] of the smaller cell's index. | ||
This construction fails for <math>j < k</math> because the index for a smaller (lower-rank) cell must have extra indices relative to the index for a larger one. There is no way to choose a single index: in fact, as long as the axes of our array all have length greater than 1, there are multiple choices of index and the larger cell contains multiple smaller cells. As an example, a matrix can contain many rows even though a row is only ever contained in exactly one matrix. This fact should not be surprising: it's the main reason why APL uses arrays rather than lists at all! | This construction fails for <math>j < k</math> because the index for a smaller (lower-rank) cell must have extra indices relative to the index for a larger one. There is no way to choose a single index: in fact, as long as the axes of our array all have length greater than 1, there are multiple choices of index and the larger cell contains multiple smaller cells. As an example, a matrix can contain many rows even though a row is only ever contained in exactly one matrix. This fact should not be surprising: it's the main reason why APL uses arrays rather than lists at all! |