Prefix and suffix vectors: Difference between revisions

From APL Wiki
Jump to navigation Jump to search
(∊ for membership does appear in A Programming Language, after full and unit vectors)
m (Text replacement - "Direct definition (Iverson)" to "Direct definition (notation)")
 
(One intermediate revision by the same user not shown)
Line 6: Line 6:
The prefix vector <math>\alpha^j(n)</math> is defined to be the length-<math>n</math> [[vector]] where the first <math>j</math> elements (or <math>n</math>, if smaller) are 1 and the rest are 0. Likewise, the suffix vector has that many 1s at the end. In 1-indexed APL, <code>N⍺J</code> was defined to be <syntaxhighlight lang=apl inline>J≥⍳N</syntaxhighlight> and <code>N⍵J</code> to be <syntaxhighlight lang=apl inline>(1+N-J)≤⍳N</syntaxhighlight>. Because Iverson notation allows the length of a vector to be inferred from context, the first <math>j</math> elements of vector <math>v</math> can be taken with <math>\alpha^j/v</math>, and similarly <math>\alpha^j/M</math> and <math>\alpha^j/\!\!/M</math> take the first <math>j</math> columns or rows of a matrix. In APL, what is now <syntaxhighlight lang=apl inline>J↑V</syntaxhighlight> (for <syntaxhighlight lang=apl inline>J≥0</syntaxhighlight> and <syntaxhighlight lang=apl inline>J≤N</syntaxhighlight>) was written <syntaxhighlight lang=apl inline>((⍴V)⍺J)/V</syntaxhighlight>, and <syntaxhighlight lang=apl inline>(-J)↑V</syntaxhighlight> was <syntaxhighlight lang=apl inline>((⍴V)⍵J)/V</syntaxhighlight> (although most likely the shape <syntaxhighlight lang=apl inline>⍴V</syntaxhighlight> would have been saved elsewhere in the program rather than being written out). An instance of [[Drop]] such as <syntaxhighlight lang=apl inline>J↓V</syntaxhighlight> was written <syntaxhighlight lang=apl inline>(~(⍴V)⍺J)/V</syntaxhighlight>.
The prefix vector <math>\alpha^j(n)</math> is defined to be the length-<math>n</math> [[vector]] where the first <math>j</math> elements (or <math>n</math>, if smaller) are 1 and the rest are 0. Likewise, the suffix vector has that many 1s at the end. In 1-indexed APL, <code>N⍺J</code> was defined to be <syntaxhighlight lang=apl inline>J≥⍳N</syntaxhighlight> and <code>N⍵J</code> to be <syntaxhighlight lang=apl inline>(1+N-J)≤⍳N</syntaxhighlight>. Because Iverson notation allows the length of a vector to be inferred from context, the first <math>j</math> elements of vector <math>v</math> can be taken with <math>\alpha^j/v</math>, and similarly <math>\alpha^j/M</math> and <math>\alpha^j/\!\!/M</math> take the first <math>j</math> columns or rows of a matrix. In APL, what is now <syntaxhighlight lang=apl inline>J↑V</syntaxhighlight> (for <syntaxhighlight lang=apl inline>J≥0</syntaxhighlight> and <syntaxhighlight lang=apl inline>J≤N</syntaxhighlight>) was written <syntaxhighlight lang=apl inline>((⍴V)⍺J)/V</syntaxhighlight>, and <syntaxhighlight lang=apl inline>(-J)↑V</syntaxhighlight> was <syntaxhighlight lang=apl inline>((⍴V)⍵J)/V</syntaxhighlight> (although most likely the shape <syntaxhighlight lang=apl inline>⍴V</syntaxhighlight> would have been saved elsewhere in the program rather than being written out). An instance of [[Drop]] such as <syntaxhighlight lang=apl inline>J↓V</syntaxhighlight> was written <syntaxhighlight lang=apl inline>(~(⍴V)⍺J)/V</syntaxhighlight>.


The prefix and suffix vectors were considered two out of a class of "special vectors", with the others being the [[interval vector]] <math>\iota(n)</math>, now <syntaxhighlight lang=apl inline>⍳</syntaxhighlight>, and the "full vector" <math>\epsilon(n)</math> of all 1s and "unit vector" <math>\epsilon^j(n)</math>, where the value at index <math>j</math> is set to 1. However, <math>\epsilon</math> was also used for [[Membership]] (the "characteristic vector"), which is closely related in that <math>\epsilon^j(n)</math> is <syntaxhighlight lang=apl inline>(⍳N)∊J</syntaxhighlight>; only this meaning was defined in APL. The [[glyph]]s <code>⍺</code> and <code>⍵</code> came to be used as argument names in [[direct definiton]] and later [[dfn]]s.
The prefix and suffix vectors were considered two out of a class of "special vectors", with the others being the [[interval vector]] <math>\iota(n)</math>, now <syntaxhighlight lang=apl inline>⍳</syntaxhighlight>, and the "full vector" <math>\epsilon(n)</math> of all 1s and "unit vector" <math>\epsilon^j(n)</math>, where the value at index <math>j</math> is set to 1. However, <math>\epsilon</math> was also used for [[Membership]] (the "characteristic vector"), which is closely related in that <math>\epsilon^j(n)</math> is <syntaxhighlight lang=apl inline>(⍳N)∊J</syntaxhighlight>; only this meaning was defined in APL. The [[glyph]]s <code>⍺</code> and <code>⍵</code> came to be used as argument names in [[Direct definition (notation)|direct definition]] and later [[dfn]]s.


{{quote|Very little has been rendered obsolete in the course of this. One thing that has been, and gave us some pain, (I don’t know if it gives you any pain) and that was the removal of the alpha and omega from the list of operators; but I don’t think the released systems had those, so you never missed them. We had them and it was a bit of a jar to lose them. But they are gone now.|—[[Adin Falkoff]]<ref>[[Adin Falkoff]]. [https://www.jsoftware.com/papers/apl360history.htm APL\360 History] at [[APL69]].</ref>}}
{{quote|Very little has been rendered obsolete in the course of this. One thing that has been, and gave us some pain, (I don’t know if it gives you any pain) and that was the removal of the alpha and omega from the list of operators; but I don’t think the released systems had those, so you never missed them. We had them and it was a bit of a jar to lose them. But they are gone now.|—[[Adin Falkoff]]<ref>[[Adin Falkoff]]. [https://www.jsoftware.com/papers/apl360history.htm APL\360 History] at [[APL69]].</ref>}}

Latest revision as of 01:59, 8 March 2024

In Iverson notation, the prefix vector and suffix vector of weight and length are Boolean vectors that can be used with Compress to select a prefix or suffix of a vector, a task now performed with Take. Primitives and based on this notation were defined in IVSYS/7090 and APL\360, but removed from APL\360 before its public release in 1968.

The prefix vector is defined to be the length- vector where the first elements (or , if smaller) are 1 and the rest are 0. Likewise, the suffix vector has that many 1s at the end. In 1-indexed APL, N⍺J was defined to be J≥⍳N and N⍵J to be (1+N-J)≤⍳N. Because Iverson notation allows the length of a vector to be inferred from context, the first elements of vector can be taken with , and similarly and take the first columns or rows of a matrix. In APL, what is now J↑V (for J≥0 and J≤N) was written ((⍴V)⍺J)/V, and (-J)↑V was ((⍴V)⍵J)/V (although most likely the shape ⍴V would have been saved elsewhere in the program rather than being written out). An instance of Drop such as J↓V was written (~(⍴V)⍺J)/V.

The prefix and suffix vectors were considered two out of a class of "special vectors", with the others being the interval vector , now , and the "full vector" of all 1s and "unit vector" , where the value at index is set to 1. However, was also used for Membership (the "characteristic vector"), which is closely related in that is (⍳N)∊J; only this meaning was defined in APL. The glyphs and came to be used as argument names in direct definition and later dfns.

Very little has been rendered obsolete in the course of this. One thing that has been, and gave us some pain, (I don’t know if it gives you any pain) and that was the removal of the alpha and omega from the list of operators; but I don’t think the released systems had those, so you never missed them. We had them and it was a bit of a jar to lose them. But they are gone now.

Adin Falkoff[1]

References


APL built-ins [edit]
Primitives (Timeline) Functions
Scalar
Monadic ConjugateNegateSignumReciprocalMagnitudeExponentialNatural LogarithmFloorCeilingFactorialNotPi TimesRollTypeImaginarySquare RootRound
Dyadic AddSubtractTimesDivideResiduePowerLogarithmMinimumMaximumBinomialComparison functionsBoolean functions (And, Or, Nand, Nor) ∙ GCDLCMCircularComplexRoot
Non-Scalar
Structural ShapeReshapeTallyDepthRavelEnlistTableCatenateReverseRotateTransposeRazeMixSplitEncloseNestCut (K)PairLinkPartitioned EnclosePartition
Selection FirstPickTakeDropUniqueIdentityStopSelectReplicateExpandSet functions (IntersectionUnionWithout) ∙ Bracket indexingIndexCartesian ProductSort
Selector Index generatorGradeIndex OfInterval IndexIndicesDealPrefix and suffix vectors
Computational MatchNot MatchMembershipFindNub SieveEncodeDecodeMatrix InverseMatrix DivideFormatExecuteMaterialiseRange
Operators Monadic EachCommuteConstantReplicateExpandReduceWindowed ReduceScanOuter ProductKeyI-BeamSpawnFunction axisIdentity (Null, Ident)
Dyadic BindCompositions (Compose, Reverse Compose, Beside, Withe, Atop, Over) ∙ Inner ProductDeterminantPowerAtUnderRankDepthVariantStencilCutDirect definition (operator)Identity (Lev, Dex)
Quad names Index originComparison toleranceMigration levelAtomic vector