将字符向量分成段

时间:2014-07-22 05:55:46

标签: vector apl dyalog

我有以下向量VecACGTTGCA并希望将其划分为嵌套向量,其中在i-iith位置将有Vec长度为4的子段,从{{1}的第i个位置开始}}

例如,Vec返回:

Vec[(⍳¯3+⍴Vec)∘.+¯1+⍳4]

但上面输出的问题是它是一个字符矩阵,而我想获得以下输出:

ACGT
CGTT
GTTG
TTGC
TGCA

对于以下字符串: ┌──────────────────────────┐ │┌────┬────┬────┬────┬────┐│ ││ACGT│CGTT│GTTG│TTGC│TGCA││ │└────┴────┴────┴────┴────┘│ └──────────────────────────┘ 我正在寻找的正确结果将是:

vec←'Hy, only testing segmenting vec into pieces of 4'

此外,有没有办法将此类矢量转换为单个矢量,后续行中将包含4个字符?

示例:对于┌→────────────────────────────────────────┐ │ ┌→───┐ ┌→───┐ ┌→───┐ ┌→───┐ │ │ │Hy, │ │y, o│ │, on│ │ onl│ (and so on) │ │ └────┘ └────┘ └────┘ └────┘ │ └∊────────────────────────────────────────┘ 字符向量,结果为:

foobartesting

3 个答案:

答案 0 :(得分:3)

要回到原来的问题:你只需要添加一个领先的"分裂" (↓)将矩阵结果转换为您正在寻找的向量向量。请注意,虽然它可能不那么优雅,但经典"基于生成索引矩阵的解决方案可能更有效,因为特定窗口缩减不在大多数APL解释器优化的案例列表上。

在英特尔酷睿i5 @ 1.60Ghz上运行的Dyalog APL v14.0 / 64中:

X←' foobartesting'

(4,/ x)在大约9.3微秒内执行

(↓4 {⍵[(0,⍳-⍺-⍴⍵)∘。+⍳⍺]} x)时钟在2.3左右

随着向量长度的增加,效率差距增大;当你达到一个长度为10,000的参数时,窗口减少几乎慢了10倍(7对0.7毫秒)。

在Dyalog APL中,"经典"通过1字节和2字节整数类型的可用性增强了方法;如果您使用其他APL口译员,您的里程可能会有所不同。

答案 1 :(得分:2)

这是在GNU APL中测试的,但我不认为这在Dyalog中应该有所不同。我的解决方案就像这样简单:

      4 ,/ 'foobartesting'
 foob ooba obar bart arte rtes test esti stin ting

答案 2 :(得分:0)

我不确定我是否理解你的描述。 但我明白的是,你有一个载体:

vec←'Hy, only testing segmenting vec into pieces of 4'

哦,此外,我们需要为此执行分配迁移级别; - )

⎕ml←3

理解问题后修改答案;-):

      display 4{⍺↑¨(0,⍳(⍴⍵)-⍺)↓¨⊂⍵}'ACGTTGCA'
┌→───────────────────────────────────┐
│ ┌→───┐ ┌→───┐ ┌→───┐ ┌→───┐ ┌→───┐ │
│ │ACGT│ │CGTT│ │GTTG│ │TTGC│ │TGCA│ │
│ └────┘ └────┘ └────┘ └────┘ └────┘ │
└∊───────────────────────────────────┘