J. *_*llé 5 vector apl dyalog interleave
我试图解决使用APL的一个问题,对此我有两个向量v1和v2,用相对长度最多+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)
如果你不介意在向量长度不等的情况下获得原型填充元素,那么
Interleave?{,???}
Run Code Online (Sandbox Code Playgroud)
会做.在线尝试!
否则,您可以交错匹配的部分,然后附加缺少的元素(s - 它适用于长度差异大于1):
Interleave?{
lengths??/?¨?
main?,??lengths?¨?
tail??,/lengths?¨?
main,tail
}
Run Code Online (Sandbox Code Playgroud)
使用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的第一个元素。