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

J. *_*llé 5 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版)

Lob*_*sky 10

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

(v0,v1)[?(??v0),??v1]
Run Code Online (Sandbox Code Playgroud)

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

(v0,v1)[?(??,v0),??,v1]
Run Code Online (Sandbox Code Playgroud)


Adá*_*dám 6

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

Interleave?{,???}
Run Code Online (Sandbox Code Playgroud)

会做.在线尝试!

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

Interleave?{
    lengths??/?¨?
    main?,??lengths?¨?
    tail??,/lengths?¨?
    main,tail
}
Run Code Online (Sandbox Code Playgroud)

在线尝试!


Uri*_*iel 6

使用Dyalog dfn:

zip ? {
    mix ? ,?? ? ?
    mask ? ,?? 1?¨¨ ? ?
    mask / mix
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

在线尝试!


小智 5

因为我不了解Dyalog APL,所以我以1970年代的旧ISO APL来回答:
(v1,v2)[?((0.5×(?v1)<?v2)+??v1),((0.5×(?v2)<?v1)+??v2]

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