如何在APL中交织两个给定的向量

时间:2018-01-11 13:11:17

标签: vector apl dyalog interleave

我正在尝试使用APL解决问题,我有两个向量v1v2,相对长度最多为+1,具体取决于输入。这意味着((≢v1)-(≢v2))∊¯1 0 1

交错所述向量的最佳方法是什么,以便创建第三个向量v3,使v3=v1[0],v2[0],v1[1],v2[1],...

(如果相关,我使用的是Dyalog APL 16.0版)

6 个答案:

答案 0 :(得分:8)

这几乎适用于每个APL。

(v0,v1)[⍋(⍳⍴v0),⍳⍴v1]

如果您想担心v0或v1是标量,那么

(v0,v1)[⍋(⍳⍴,v0),⍳⍴,v1]

答案 1 :(得分:5)

如果你不介意在向量长度不等的情况下获得原型填充元素,那么

Interleave←{,⍉↑⍵}

会做的。 Try it online!

否则,您可以交错匹配的部分,然后附加缺少的元素(s - 它适用于大于1的长度差异):

Interleave←{
    lengths←⌊/≢¨⍵
    main←,⍉↑lengths↑¨⍵
    tail←⊃,/lengths↓¨⍵
    main,tail
}

Try it online!

答案 2 :(得分:5)

使用Dyalog dfn

zip ← {
    mix ← ,⍉↑ ⍺ ⍵
    mask ← ,⍉↑ 1⊣¨¨ ⍺ ⍵
    mask / mix
}

这里的想法是混合两个参数,然后转置结果并最终展平它(mix)。

然后,我们在1 s的数组上应用相同的数组(mask),并将其用作掩码,以过滤由混合原语。

请注意,这也允许压缩长度差异大于一个元素的数组。

Try it online!

答案 3 :(得分:4)

由于我不了解Dyalog APL,我回答了1970年代的旧ISO APL:
$.ajax({ url: flickerAPI, dataType: 'JSON', jsonpCallback: 'callback', type: 'GET', })

第一个元素将是longuest向量之一,如果它们具有相同的长度,则第一个元素是v1的第一个元素。

答案 4 :(得分:3)

以下是我如何解决APL2中的原始问题:

LEN←∊⌊/⍴¨V1 V2 
V3←∊((LEN↑V1),¨LEN↑V2),LEN↓¨V1 V2

答案 5 :(得分:-1)

对于相同长度的向量,请使用内积:

 1 2 3,.,40 50 60

┌──────────────┐
│1 40 2 50 3 60│
└──────────────┘

在此基础上构建此dfn:

{r←(⍴⍺)⌊⍴⍵⋄(∊(r⍴⍺),.,r⍴⍵),(r↓⍺),r↓⍵}

或者,我们可以层叠(保持相同的整体逻辑):

{r←(⍴⍺)⌊⍴⍵⋄(,(r⍴⍺),⍪r⍴⍵),(r↓⍺),r↓⍵}