4,494
edits
DanielAjoy (talk | contribs) m (changed a 2 to a 4) |
m (Text replacement - "<source" to "<syntaxhighlight") |
||
Line 2: | Line 2: | ||
== Examples == | == Examples == | ||
< | <syntaxhighlight lang=apl> | ||
x ← 1 2 3 | x ← 1 2 3 | ||
y ← 4 5 6 | y ← 4 5 6 | ||
Line 25: | Line 25: | ||
</source> | </source> | ||
The [[shape]]s of the arguments must be compatible with each other: The last [[axis]] of the left argument must have the same length as the first axis of the right argument, or formally, for < | The [[shape]]s of the arguments must be compatible with each other: The last [[axis]] of the left argument must have the same length as the first axis of the right argument, or formally, for <syntaxhighlight lang=apl inline>X f.g Y</source> it must be that <syntaxhighlight lang=apl inline>(¯1↑⍴X)≡(1↑⍴Y)</source>. Although this rule differs from [[conformability]], the arguments may also be subject to [[scalar extension|scalar]] or [[singleton extension]]. The shape of the result is <syntaxhighlight lang=apl inline>(¯1↓⍴X),(1↓⍴Y)</source>. | ||
For example, when applying inner product on two [[matrix|matrices]], the number of columns in the left array must match with number of rows in the right array, otherwise we will get an error. | For example, when applying inner product on two [[matrix|matrices]], the number of columns in the left array must match with number of rows in the right array, otherwise we will get an error. | ||
< | <syntaxhighlight lang=apl> | ||
⎕ ← x ← 2 3⍴⍳10 | ⎕ ← x ← 2 3⍴⍳10 | ||
1 2 3 | 1 2 3 | ||
Line 85: | Line 85: | ||
\end{align} | \end{align} | ||
</math> | </math> | ||
When the inner product notation was linearised (made to fit on a single line of code) the [[glyph]] < | When the inner product notation was linearised (made to fit on a single line of code) the [[glyph]] <syntaxhighlight lang=apl inline>.</source> was chosed to denote what was previously indicated by positioning the two [[operand]]s vertically aligned. Thus, the above correspond to the following modern APL: | ||
< | <syntaxhighlight lang=apl> | ||
⍝ For example, if | ⍝ For example, if | ||
A←3 4⍴1 3 2 0 2 1 0 1 4 0 0 2 | A←3 4⍴1 3 2 0 2 1 0 1 4 0 0 2 | ||
Line 108: | Line 108: | ||
6 1 | 6 1 | ||
</source> | </source> | ||
Note that some dialects implement [[Compress]] (< | Note that some dialects implement [[Compress]] (<syntaxhighlight lang=apl inline>/</source>) as a [[monadic operator]] rather than as a function, which means it cannot be an operand in the inner product. Instead, a cover function is necessary: | ||
< | <syntaxhighlight lang=apl> | ||
∇z←a Compress b | ∇z←a Compress b | ||
z←a/b | z←a/b | ||
Line 116: | Line 116: | ||
== Differences between dialects == | == Differences between dialects == | ||
Implementations differ on the exact behaviour of inner product when the right operand is not a [[scalar function]]. It follows from page 121 of the ISO/IEC 13751:2001(E) [[standard]] specifies that < | Implementations differ on the exact behaviour of inner product when the right operand is not a [[scalar function]]. It follows from page 121 of the ISO/IEC 13751:2001(E) [[standard]] specifies that <syntaxhighlight lang=apl inline>X f.g Y</source> is equivalent to <syntaxhighlight lang=apl inline>f/¨ (⊂[⍴⍴x]x)∘.g ⊂[1]y</source>. This is indeed what [[APL2]], [[APLX]], [[APL+Win]], and [[ngn/apl]] follow, while [[Dyalog APL]], [[NARS2000]] and [[GNU APL]] differ as described by [[Roger Hui]]:<ref>[[Roger Hui]]. ''inner product''. Internal Dyalog email. 24 July 2020.</ref> | ||
<blockquote> | <blockquote> | ||
The following dop models inner product in Dyalog APL, with caveats. If you find a case where < | The following dop models inner product in Dyalog APL, with caveats. If you find a case where <syntaxhighlight lang=apl inline>f.g</source> differs from <syntaxhighlight lang=apl inline>f IP g</source>, not covered by the caveats, I'd be interested. | ||
< | <syntaxhighlight lang=apl> | ||
IP←{ | IP←{ | ||
assert((⊃⌽⍴⍺)≡≢⍵)∨(1=×/⍴⍺)∨1=×/⍴⍵: | assert((⊃⌽⍴⍺)≡≢⍵)∨(1=×/⍴⍺)∨1=×/⍴⍵: | ||
Line 127: | Line 127: | ||
assert←{⍺←'assertion failure' ⋄ 0∊⍵:⍺ ⎕SIGNAL 8 ⋄ shy←0} | assert←{⍺←'assertion failure' ⋄ 0∊⍵:⍺ ⎕SIGNAL 8 ⋄ shy←0} | ||
</source> | </source> | ||
(Explanation: What's with the < | (Explanation: What's with the <syntaxhighlight lang=apl inline>⊃⍤0</source> in <syntaxhighlight lang=apl inline>IP</source>? It's because <syntaxhighlight lang=apl inline>∘.f</source> has an implicit each, applying <syntaxhighlight lang=apl inline>⊂</source> to each item of its result. But the <syntaxhighlight lang=apl inline>⍺⍺/</source> in <syntaxhighlight lang=apl inline>(⍺⍺/⍵⍵¨)</source> also has an implicit each. So the <syntaxhighlight lang=apl inline>⊃⍤0</source> gets rid of one of those encloses.) | ||
Caveats: | Caveats: | ||
* You can not use the hybrid < | * You can not use the hybrid <syntaxhighlight lang=apl inline>/</source> directly as an operand as it runs afoul of the parser in weird and wonderful ways. Instead, you have to use <syntaxhighlight lang=apl inline>{⍺/⍵}</source>. The same goes for <syntaxhighlight lang=apl inline>\</source> and <syntaxhighlight lang=apl inline>{⍺\⍵}</source> I guess. | ||
* It differs from ISO/IEC 13751:2001(E) in using < | * It differs from ISO/IEC 13751:2001(E) in using <syntaxhighlight lang=apl inline>⍵⍵¨</source> instead of just <syntaxhighlight lang=apl inline>⍵⍵</source> in the central key expression (i.e. <syntaxhighlight lang=apl inline>(⍺⍺/⍵⍵¨)</source> instead of <syntaxhighlight lang=apl inline>(⍺⍺/⍵⍵)</source>). So does the primitive <syntaxhighlight lang=apl inline>f.g</source>. | ||
* It differs from ISO/IEC 13751:2001(E) in doing full-blown single extension instead of just scalar and 1-element vector extension (as in APL2). So does the primitive < | * It differs from ISO/IEC 13751:2001(E) in doing full-blown single extension instead of just scalar and 1-element vector extension (as in APL2). So does the primitive <syntaxhighlight lang=apl inline>f.g</source>. e.g.<syntaxhighlight lang=apl> | ||
(3 4⍴5)+.×1 1 1 1⍴6 ⍝ works in Dyalog, not in ISO or APL2</source> | (3 4⍴5)+.×1 1 1 1⍴6 ⍝ works in Dyalog, not in ISO or APL2</source> | ||
* It differs from NARS2000 or APL\360 in not permitting unit axis extension. So does the primitive < | * It differs from NARS2000 or APL\360 in not permitting unit axis extension. So does the primitive <syntaxhighlight lang=apl inline>f.g</source>. e.g.<syntaxhighlight lang=apl> | ||
(3 4⍴5)+.×1 5⍴6 ⍝ works in NARS2000 or APL\360, not in Dyalog APL</source> | (3 4⍴5)+.×1 5⍴6 ⍝ works in NARS2000 or APL\360, not in Dyalog APL</source> | ||
</blockquote> | </blockquote> |