rslt ← part (redn ##.pred) rarg             ⍝ Partitioned reduction.

Suggested  by Michael Baas, pred returns a partitioned reduction of its argument
array. [part] is a vector of partition sizes, such that (+/part)=¯1↑⍴rarg.

Ways to code this operator include:

    pred←{⎕ml←1 ⋄ ⍺⍺/¨(∊⍺↑¨1)⊂⍵}                    ⍝ --3   SL
    pred←{(⎕io ⎕ml)←1 3 ⋄ ⍺⍺/¨(⍺/⍳⍴⍺)⊂⍵}            ⍝ 1-3   VMJ/MJ
    pred←{(⎕io ⎕ml)←1 3 ⋄ ⍺⍺/⊃(⍺/⍳⍴⍺)⊂⍵}            ⍝ 12-   GQ
    pred←{res←(⍴⍺)⍴⍺⍺/⍬ ⋄ res[⍺/⍳⊃⍴⍺]⍺⍺←⍵ ⋄ res}    ⍝ -2-   BT

    pred←{⎕ml←3 ⋄  ⍺⍺ nz/⊃(⍺/⍳⍴⍺)⊂⍵}                ⍝ 12-   SM
    pred←{⎕io←0 ⋄ (<⍀(+\⍺)∘.>⍳⍴⍵)⍺⍺ nz.×⍵}          ⍝ -2-   SM
    pred←{⎕io←0 ⋄ ⍉(<⍀(+\⍺)∘.>⍳¯1↑⍴⍵)⍺⍺ nz.×⍉⍵}     ⍝ 12-   SM, where:
      nz←{0≠⍺×⍵: ⍺ ⍺⍺ ⍵ ⋄ ⍺=0:⍵ ⋄ ⍺}                ⍝ auxiliary op.

Note:

1. Works for matrix (and higher rank) rarg.
2. "Each-less" solution.
3. Unrestricted operand function (eg: ',').

Examples:

      2 3 3 2 +pred ⍳10
3 12 21 19

      1 2 1 ×pred 2 3 4⍴⍳24
 1   6  4
 5  42  8
 9 110 12

13 210 16
17 342 20
21 506 24

      disp 1 2 1,pred 3 4⍴⍳12
┌→┬─────┬──┐ 
↓1│ 2 3 │4 │
├─┼~───→┼~─┤ 
│5│ 6 7 │8 │
├─┼~───→┼~─┤ 
│9│10 11│12│
└─┴~───→┴~─┘ 

See also: acc foldl

Back to: contents

Back to: Dyalog APL

Trouble seeing APL font?