Mesh

From APL Wiki
Jump to navigation Jump to search

In Iverson notation, Mesh () is a three-argument operation which merges two equal-rank arguments according to a Boolean vector. The relationship between Mask and Mesh is similar to that between Compress and Expand. A related function also named Mesh is implemented in NARS and NARS2000 as a case of Compose: L(a∘\)R combines L and R using an integer (not Boolean) control vector. Bob Bernecky has suggested the syntax a(u\)b (requiring Expand to be an operator) for .[1]

In Iverson notation

Mesh in Iverson notation combines or interleaves two arguments according to a Boolean control. The result has the same shape as the control array, and contains entries taken from the left argument when the control is 0 and from the right when it is 1.

A Programming Language defines the Mesh for vectors and and Boolean vector , where , and , to be the vector whose compressions by and its negation yield the other arguments: and . Conformability requirements give ; because we have .

Mesh is a generalization of Catenate , since meshing with a suffix vector produces .

Iverson notes the following relationships between Mask, Mesh, Compress, and Expand:

The following forms of Mesh with matrices are defined. Below, matrices are denoted with capital letters while vectors use lowercase letters.

Iverson notation Description Modern APL (⎕IO←0) Notes
mesh matrices along rows u⊃¨⍤1⊢((~u)\A),¨(u\B)
mesh differently for each row U⊃¨⍤1⊢((~U)\⍤1⊢A),¨(U\⍤1⊢B) where in each component
mesh vectors in multiple ways U⊃¨⍤1⊢((~U)\⍤1⊢A),¨(U\⍤1⊢B) like the previous with repeated rows in and
mesh matrices along columns u⊃¨⍤0 1⊢((~u)⍀A),¨(u⍀B)
mesh differently for each column ⍉U⊃¨⍤1⊢((~U)\⍤1⍉A),¨(U\⍤1⍉B) where in each component
mesh vectors differently in each column ⍉U⊃¨⍤1⊢((~U)\⍤1⍉a),¨(U\⍤1⍉b) like the previous with repeated columns in and

APL models

In all APLs, for vectors , , and can be implemented using the ordinal idiom consisting of two copies of Grade:

(a,b)[⍋⍋u]
(b,a)[⍋⍒u]  ⍝ Reversed order by sorting u the other way

These solutions were published in 1971 by Bob Smith, who attributes them to Luther Woodrum by way of Ken Iverson.[2][3] They also appear in the FinnAPL idiom library. The idea is that every element of a and b should be included in the final result, but they are ordered based on u, so that elements of a correspond to 0s and those of b correspond to 1s. Given such a vector, sorting it according to u, or equivalently, permuting by the Grade of u, would return it to the separated vector a,b. It follows that applying the inverse permutation ⍋⍋u of ⍋u transforms a,b into the meshed vector.

Another, more straightforward strategy uses selective assignment and Expand. It creates a temporary vector t, placing elements of a in the appropriate positions with Expand, and then inserts elements of b in the appropriate positions by assigning to the Compress of t.

t←(~u)\a ⋄ (u/t)←b ⋄ t

The two steps can be reversed, as long as a is paired with ~u and b is paired with u. Structural Under allows the assignment to be performed in a functional style, with no temporary variable. For example, dzaima/APL admits these implementations:

b⍨⍢(u∘⌿) (~u)⍀a
a⍨⍢((~u)∘⌿) b⍨⍢(u∘⌿) a,b
Works in: dzaima/APL

Here any vector of the same length could be used in place of a,b.

If Mask is available, for instance as a monadic operator, then Mesh can be obtained by masking together the expansion of each argument:

((~u)\a) (u mask) u\b

Depending on available language facilities, this idea can be realized in a few different ways. Here the expressions which use indexing must have the index origin set to 0.

u⊃¨((~u)\a),¨(u\b)          ⍝ Nested APL
u(⌷⍤0 1)((~u)\a)(,⍤0)(u\b)  ⍝ With the Rank operator
((~u)\a) ⊣⍢(u∘/) (u\b)      ⍝ Structural Under

External Links

Documentation

References

  1. Bernecky, Robert. "Mask and Mesh Revisited". APL2010.
  2. Smith, Bob. "Problem section". APL Quote-Quad Vol. III No. 2&3, p.61.
  3. Hui, Roger. "An Amuse-Bouche from APL History".