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

How to interleave two given vectors in APL

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

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

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

如果您不介意在向量长度不等时获得原型填充元素,那么

Interleave←{,⍉↑⍵}

会的。 Try it online!

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

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

Try it online!

使用 Dyalog dfn:

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

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

然后,我们将相同的应用在 1s 的数组上,对应于给定数组的长度 (mask),并将其用作掩码,以过滤添加的原型通过混合原语。

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

Try it online!

因为我不知道 Dyalog APL,所以我用 1970 年代的旧 ISO APL 回答:
(v1,v2)[⍋((0.5×(⍴v1)<⍴v2)+⍳⍴v1),((0.5×(⍴v2)<⍴v1)+⍳⍴v2]

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

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

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

这应该适用于几乎每个 APL。

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

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

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

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

 1 2 3,.,40 50 60

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

在此之上构建会产生此 dfn :

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

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

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