如何在 APL 中交错两个给定的向量
How to interleave two given vectors in APL
我正在尝试使用 APL 解决问题,为此我有两个向量 v1
和 v2
,相对长度最多为 +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
}
使用 Dyalog dfn
:
zip ← {
mix ← ,⍉↑ ⍺ ⍵
mask ← ,⍉↑ 1⊣¨¨ ⍺ ⍵
mask / mix
}
这里的想法是混合两个参数,然后转置结果并最终将其展平 (mix
)。
然后,我们将相同的应用在 1
s 的数组上,对应于给定数组的长度 (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
这应该适用于几乎每个 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↓⍵}
我正在尝试使用 APL 解决问题,为此我有两个向量 v1
和 v2
,相对长度最多为 +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
}
使用 Dyalog dfn
:
zip ← {
mix ← ,⍉↑ ⍺ ⍵
mask ← ,⍉↑ 1⊣¨¨ ⍺ ⍵
mask / mix
}
这里的想法是混合两个参数,然后转置结果并最终将其展平 (mix
)。
然后,我们将相同的应用在 1
s 的数组上,对应于给定数组的长度 (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
这应该适用于几乎每个 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↓⍵}