我正在尝试使用 APL 解决问题,为此我有两个向量v1
和v2
,相对长度最多为+1
,具体取决于输入。这意味着((≢v1)-(≢v2))∊¯1 0 1
.
交错所述向量的最佳方法是什么,以便创建第三个向量v3
,这样v3=v1[0],v2[0],v1[1],v2[1],...
?
(如果相关,我使用的是 Dyalog APL 16.0 版)
我正在尝试使用 APL 解决问题,为此我有两个向量v1
和v2
,相对长度最多为+1
,具体取决于输入。这意味着((≢v1)-(≢v2))∊¯1 0 1
.
交错所述向量的最佳方法是什么,以便创建第三个向量v3
,这样v3=v1[0],v2[0],v1[1],v2[1],...
?
(如果相关,我使用的是 Dyalog APL 16.0 版)
这应该适用于几乎所有 APL。
(v0,v1)[⍋(⍳⍴v0),⍳⍴v1]
如果您想担心 v0 或 v1 是标量,那么
(v0,v1)[⍋(⍳⍴,v0),⍳⍴,v1]
使用对话dfn
:
zip ← {
mix ← ,⍉↑ ⍺ ⍵
mask ← ,⍉↑ 1⊣¨¨ ⍺ ⍵
mask / mix
}
这里的想法是混合两个参数,然后转置结果并最终将其展平(mix
)。
然后,我们在一个 s 数组上应用相同的方法1
,对应于给定数组的长度 ( mask
),并将其用作掩码,以过滤由混合原语添加的原型。
请注意,这也允许压缩长度差异大于一个元素的数组。
由于我不知道 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
对于相同长度的向量,使用内积:
1 2 3,.,40 50 60
┌──────────────┐
│1 40 2 50 3 60│
└──────────────┘
在此基础上构建 dfn :
{r←(⍴⍺)⌊⍴⍵⋄(∊(r⍴⍺),.,r⍴⍵),(r↓⍺),r↓⍵}
或者,我们可以层压(保持相同的整体逻辑):
{r←(⍴⍺)⌊⍴⍵⋄(,(r⍴⍺),⍪r⍴⍵),(r↓⍺),r↓⍵}