我正在尝试使用APL解决问题,我有两个向量v1
和v2
,相对长度最多为+1
,具体取决于输入。这意味着((≢v1)-(≢v2))∊¯1 0 1
。
交错所述向量的最佳方法是什么,以便创建第三个向量v3
,使v3=v1[0],v2[0],v1[1],v2[1],...
?
(如果相关,我使用的是Dyalog APL 16.0版)
答案 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
}
答案 2 :(得分:5)
使用Dyalog dfn
:
zip ← {
mix ← ,⍉↑ ⍺ ⍵
mask ← ,⍉↑ 1⊣¨¨ ⍺ ⍵
mask / mix
}
这里的想法是混合两个参数,然后转置结果并最终展平它(mix
)。
然后,我们在1
s的数组上应用相同的数组(mask
),并将其用作掩码,以过滤由混合原语。
请注意,这也允许压缩长度差异大于一个元素的数组。
答案 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↓⍵}