Leading axis agreement: Difference between revisions

From APL Wiki
Jump to navigation Jump to search
(List languages that use it in the intro)
m (Text replacement - "</source>" to "</syntaxhighlight>")
Line 17: Line 17:
10 11 12
10 11 12
13 14 15
13 14 15
</source>
</syntaxhighlight>
{{Works in|[[J]]}}
{{Works in|[[J]]}}


Line 31: Line 31:
10 11 12
10 11 12
13 14 15
13 14 15
</source>
</syntaxhighlight>
{{Works in|[[J]]}}
{{Works in|[[J]]}}


Line 45: Line 45:
10 11 12
10 11 12
23 24 25
23 24 25
</source>
</syntaxhighlight>
{{Works in|[[J]]}}
{{Works in|[[J]]}}


In this case, <source lang=j inline>x</source> has shape <source lang=j inline>2</source> and <source lang=j inline>y</source> has shape <source lang=j inline>2 3</source>. Since the leading axes agree and the rank difference is 1, each atom (or 0-[[cell]]) of <source lang=j inline>x</source> is matched with each row (or 1-cell) of <source lang=j inline>y</source>, and the two rows in the result are the results of <source lang=j inline>10 + 0 1 2</source> and <source lang=j inline>20 + 3 4 5</source>, respectively.
In this case, <source lang=j inline>x</syntaxhighlight> has shape <source lang=j inline>2</syntaxhighlight> and <source lang=j inline>y</syntaxhighlight> has shape <source lang=j inline>2 3</syntaxhighlight>. Since the leading axes agree and the rank difference is 1, each atom (or 0-[[cell]]) of <source lang=j inline>x</syntaxhighlight> is matched with each row (or 1-cell) of <source lang=j inline>y</syntaxhighlight>, and the two rows in the result are the results of <source lang=j inline>10 + 0 1 2</syntaxhighlight> and <source lang=j inline>20 + 3 4 5</syntaxhighlight>, respectively.


== Model ==
== Model ==
Line 63: Line 63:
10 11 12
10 11 12
23 24 25
23 24 25
</source>
</syntaxhighlight>
{{Works in|Dyalog APL}}
{{Works in|Dyalog APL}}


== Aligning axes using the Rank operator ==
== Aligning axes using the Rank operator ==


When using the [[Rank (operator)|Rank operator]] for dyadic functions as in <source lang=apl inline>X (f⍤m n) Y</source>, the [[Frame|frames]] of <source lang=apl inline>X</source> and <source lang=apl inline>Y</source> are checked for conformability. Combined with leading axis agreement, the Rank operator can be used to align the [[axis|axes]] to be matched.
When using the [[Rank (operator)|Rank operator]] for dyadic functions as in <source lang=apl inline>X (f⍤m n) Y</syntaxhighlight>, the [[Frame|frames]] of <source lang=apl inline>X</syntaxhighlight> and <source lang=apl inline>Y</syntaxhighlight> are checked for conformability. Combined with leading axis agreement, the Rank operator can be used to align the [[axis|axes]] to be matched.


<source lang=j>
<source lang=j>
Line 90: Line 90:
53 54
53 54
65 66
65 66
</source>
</syntaxhighlight>


{{Works in|[[J]]}}
{{Works in|[[J]]}}
[[Category:Leading axis theory]][[Category:Function characteristics]][[Category:Conformability]]{{APL features}}
[[Category:Leading axis theory]][[Category:Function characteristics]][[Category:Conformability]]{{APL features}}

Revision as of 20:59, 10 September 2022

Leading axis agreement, sometimes called prefix agreement, is a conformability rule designed for leading axis theory and used by J and BQN. It states that a dyadic scalar function can be applied between two arrays only if one of their shapes is a prefix of the other. The shape of the result is that of the argument with higher rank.

Examples

The following examples use J for demonstration purposes.

A scalar dyadic function works when the two arrays have the same shape:

<source lang=j>

  ]x =: 2 3 $ 10

10 10 10 10 10 10

  ]y =: 2 3 $ i.6

0 1 2 3 4 5

  x + y

10 11 12 13 14 15 </syntaxhighlight>

Works in: J

as well as when one is a scalar:

<source lang=j>

  ]x =: 10

10

  ]y =: 2 3 $ i.6

0 1 2 3 4 5

  x + y

10 11 12 13 14 15 </syntaxhighlight>

Works in: J

The two cases above are already supported in other APLs in the form of scalar extension. J goes one step further, allowing the lower-rank array argument to have nonzero rank, as long as the leading dimensions match:

<source lang=j>

  ]x =: 10 20

10 20

  ]y =: 2 3 $ i.6

0 1 2 3 4 5

  x + y

10 11 12 23 24 25 </syntaxhighlight>

Works in: J

In this case, <source lang=j inline>x</syntaxhighlight> has shape <source lang=j inline>2</syntaxhighlight> and <source lang=j inline>y</syntaxhighlight> has shape <source lang=j inline>2 3</syntaxhighlight>. Since the leading axes agree and the rank difference is 1, each atom (or 0-cell) of <source lang=j inline>x</syntaxhighlight> is matched with each row (or 1-cell) of <source lang=j inline>y</syntaxhighlight>, and the two rows in the result are the results of <source lang=j inline>10 + 0 1 2</syntaxhighlight> and <source lang=j inline>20 + 3 4 5</syntaxhighlight>, respectively.

Model

In dialects that do not feature leading axis agreement, it can nevertheless be utilised by the introduction of an explicit operator: <source lang=apl>

     _LA←{⍺ ⍺⍺⍤(-⍺⌊⍥(≢⍴)⍵)⊢⍵}
     ⊢x ← 10 20

10 20

     ⊢y ← 2 3 ⍴ ⍳ 6

0 1 2 3 4 5

     x +_LA y

10 11 12 23 24 25 </syntaxhighlight>

Works in: Dyalog APL

Aligning axes using the Rank operator

When using the Rank operator for dyadic functions as in <source lang=apl inline>X (f⍤m n) Y</syntaxhighlight>, the frames of <source lang=apl inline>X</syntaxhighlight> and <source lang=apl inline>Y</syntaxhighlight> are checked for conformability. Combined with leading axis agreement, the Rank operator can be used to align the axes to be matched.

<source lang=j>

  NB. $x         : 2|3
  NB. $y         :  |3 2
  NB. ------------------
  NB. $x +"1 2 y : 2 3 2
  ]x =: 2 3 $ 10 20 30 40 50 60

10 20 30 40 50 60

  ]y =: 3 2 $ 1 2 3 4 5 6

1 2 3 4 5 6

  x +"1 2 y

11 12 23 24 35 36

41 42 53 54 65 66 </syntaxhighlight>

Works in: J
APL features [edit]
Built-ins Primitives (functions, operators) ∙ Quad name
Array model ShapeRankDepthBoundIndex (Indexing) ∙ AxisRavelRavel orderElementScalarVectorMatrixSimple scalarSimple arrayNested arrayCellMajor cellSubarrayEmpty arrayPrototype
Data types Number (Boolean, Complex number) ∙ Character (String) ∙ BoxNamespaceFunction array
Concepts and paradigms Conformability (Scalar extension, Leading axis agreement) ∙ Scalar function (Pervasion) ∙ Identity elementComplex floorArray ordering (Total) ∙ Tacit programming (Function composition, Close composition) ∙ GlyphLeading axis theoryMajor cell searchFirst-class function
Errors LIMIT ERRORRANK ERRORSYNTAX ERRORDOMAIN ERRORLENGTH ERRORINDEX ERRORVALUE ERROREVOLUTION ERROR