Decode

From APL Wiki
Jump to navigation Jump to search

Decode (), also called Base, is a dyadic primitive function which evaluates the right argument in terms of the radix system defined by the left argument. Some implementations add monadic usage to this function, where the left argument defaults to the scalar 2. Decode is the inverse of Encode with the same left argument X, when X is a vector and the right argument is a valid representation of a number in the radix system defined by X.

APL model

Decode can be viewed as calculating the "digit values" defined by the radix system, followed by inner product. The digit values are found by product scan. Note that the first number of the radix is ignored; it is there simply to be consistent with Encode.

      0 24 60∘.=3  ⍝ 1 day is 24 hours = 1440 minutes, 1 hour is 60 minutes
1440 60 1
      ⌽×\1,⌽10 24 60  ⍝ The digit values of radix 0 24 60
1440 60 1

If the left argument is a scalar number, it is converted to a vector filled with that number.

      10∘.=3  ⍝ Base 10
100 10 1
      ⌽×\1,⌽1310
100 10 1

The resulting model looks like this:

Decode{
  (⌽×\1,⌽(1()⍴⊢)1)+.×
}

Examples

A common use case is to convert from base-N digits to an integer, usually in base 2 or 10.

      101 2 3 4 5  ⍝ Base 10
12345
      21 0 1 0 1  ⍝ Base 2
21

But since the left and right argument's values are not restricted in any way, XY with scalar X can also be thought as evaluating the polynomial Y at given value X. For example, evaluating at can be done as follows:

      ¯32 0 0 3 1  ⍝ Polynomial terms are written highest first, and absent terms are written as 0
154

Decode can be also used to convert from a measure given in a hierarchy of units to the smallest unit. For example, given that 1 day = 24 hours, 1 hour = 60 minutes, and 1 minute = 60 seconds, how many seconds is 2 days, 10 hours, 34 minutes, and 19 seconds?

      0 24 60 602 10 34 19
210859

Decode can be also found in many idioms. Some of the simple and useful ones are reproduced here:

      M3 4⍴⍳12
1  2  3  4
5  6  7  8
9 10 11 12

      ⍝ 1⊥ is sum over the first axis (+⌿)
      13 1 4 1 5 9
23
      1M
15 18 21 24

      ⍝ 0⊥ is last item over the first axis (⊢⌿), or last major cell
      03 1 4 1 5 9
9
      0M
9 10 11 12

      ⍝ ⊥⍨ on a boolean vector counts trailing ones
      1 1 0 1 1 1
3

Decode has an important property with array index: Given an arbitrary array A with shape S, the index of an element in A can be decoded with S to obtain the corresponding index in the ravel of A. Decoding all indices given by Index Generator shows the ravel order of the elements of an array with the given shape. Note that index origin 0 (⎕IO0) is required for this to hold.

      ⎕IO0
      M2 3 4⎕A
      M[1;0;2]=(,M)[2 3 41 0 2]
1
      2 3 4¨2 3 4
 0  1  2  3
 4  5  6  7
 8  9 10 11
           
12 13 14 15
16 17 18 19
20 21 22 23

External links

Lesson

Documentation


APL built-ins [edit]
Primitive functions
Scalar
Monadic ConjugateNegateSignumReciprocalMagnitudeExponentialNatural LogarithmFloorCeilingFactorialNotPi TimesRollTypeImaginarySquare Root
Dyadic AddSubtractTimesDivideResiduePowerLogarithmMinimumMaximumBinomialComparison functionsBoolean functions (And, Or, Nand, Nor) ∙ GCDLCMCircularComplexRoot
Non-Scalar
Structural ShapeReshapeTallyDepthRavelEnlistTableCatenateReverseRotateTransposeRazeMixSplitEncloseNestCut (K)PairLinkPartitioned EnclosePartition
Selection FirstPickTakeDropUniqueIdentitySelectReplicateExpandSet functions (IntersectionUnionWithout) ∙ Bracket indexingIndex
Selector Index generatorGradeIndex OfInterval IndexIndicesDeal
Computational MatchNot MatchMembershipFindNub SieveEncodeDecodeMatrix InverseMatrix DivideFormatExecuteMaterialiseRange
Primitive operators Monadic EachCommuteConstantReplicateExpandReduceWindowed ReduceScanOuter ProductKeyI-beamSpawnFunction axis
Dyadic BindCompositions (Compose, Reverse Compose, Beside, Atop, Over) ∙ Inner ProductPowerAtUnderRankDepthVariantStencilCut (J)
Quad names
Arrays Index originMigration levelAtomic vector
Functions Case convertUnicode convert
Operators SearchReplace