5

我正在尝试使用 APL 解决问题,为此我有两个向量v1v2,相对长度最多为+1,具体取决于输入。这意味着((≢v1)-(≢v2))∊¯1 0 1.

交错所述向量的最佳方法是什么,以便创建第三个向量v3,这样v3=v1[0],v2[0],v1[1],v2[1],...

(如果相关,我使用的是 Dyalog APL 16.0 版)

4

6 回答 6

10

这应该适用于几乎所有 APL。

(v0,v1)[⍋(⍳⍴v0),⍳⍴v1]

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

(v0,v1)[⍋(⍳⍴,v0),⍳⍴,v1]
于 2018-01-12T11:01:34.997 回答
7

如果您不介意在向量长度不等时获得原型填充元素,那么

Interleave←{,⍉↑⍵}

会做。在线尝试!

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

Interleave←{
    lengths←⌊/≢¨⍵
    main←,⍉↑lengths↑¨⍵
    tail←⊃,/lengths↓¨⍵
    main,tail
}

在线尝试!

于 2018-01-11T13:42:48.047 回答
6

使用对话dfn

zip ← {
    mix ← ,⍉↑ ⍺ ⍵
    mask ← ,⍉↑ 1⊣¨¨ ⍺ ⍵
    mask / mix
}

这里的想法是混合两个参数,然后转置结果并最终将其展平(mix)。

然后,我们在一个 s 数组上应用相同的方法1,对应于给定数组的长度 ( mask),并将其用作掩码,以过滤由混合原语添加的原型。

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

在线尝试!

于 2018-01-11T13:48:55.327 回答
5

由于我不知道 Dyalog APL,我在 1970 年代的旧 ISO APL 中回答:
(v1,v2)[⍋((0.5×(⍴v1)<⍴v2)+⍳⍴v1),((0.5×(⍴v2)<⍴v1)+⍳⍴v2]

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

于 2018-01-11T20:58:40.183 回答
4

以下是我将如何解决 APL2 中的原始问题:

LEN←∊⌊/⍴¨V1 V2 
V3←∊((LEN↑V1),¨LEN↑V2),LEN↓¨V1 V2
于 2018-01-12T09:49:04.130 回答
-1

对于相同长度的向量,使用内积:

 1 2 3,.,40 50 60

┌──────────────┐
│1 40 2 50 3 60│
└──────────────┘

在此基础上构建 dfn :

{r←(⍴⍺)⌊⍴⍵⋄(∊(r⍴⍺),.,r⍴⍵),(r↓⍺),r↓⍵}

或者,我们可以层压(保持相同的整体逻辑):

{r←(⍴⍺)⌊⍴⍵⋄(,(r⍴⍺),⍪r⍴⍵),(r↓⍺),r↓⍵}
于 2019-08-23T15:56:58.493 回答