4

我有以下向量Vec: ACGTTGCA并想将其划分为一个嵌套向量,其中在第 i 个位置上将有一个Vec长度为 4 的子段,从 的第 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' 我正在寻找的正确结果是:

┌→────────────────────────────────────────┐
│ ┌→───┐ ┌→───┐ ┌→───┐ ┌→───┐             │
│ │Hy, │ │y, o│ │, on│ │ onl│ (and so on) │
│ └────┘ └────┘ └────┘ └────┘             │
└∊────────────────────────────────────────┘

另外,有没有办法将这样的向量转换为单个向量,其中后续行将包含 4 个字符?

示例:对于foobartesting字符向量,结果将是:

foob
ooba
obar
bart
arte
rtes
test
esti
stin
ting
4

3 回答 3

3

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

在 Intel Core 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 口译员,您的里程可能会有所不同。

于 2014-08-16T12:36:16.437 回答
2

这是在 GNU APL 中测试的,但我认为这在 Dyalog 中应该没有什么不同。我的解决方案很简单:

      4 ,/ 'foobartesting'
 foob ooba obar bart arte rtes test esti stin ting
于 2014-07-28T16:30:10.037 回答
0

我不确定我是否正确理解了您的描述。但我的理解是,你有一个向量:

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

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

⎕ml←3

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

      display 4{⍺↑¨(0,⍳(⍴⍵)-⍺)↓¨⊂⍵}'ACGTTGCA'
┌→───────────────────────────────────┐
│ ┌→───┐ ┌→───┐ ┌→───┐ ┌→───┐ ┌→───┐ │
│ │ACGT│ │CGTT│ │GTTG│ │TTGC│ │TGCA│ │
│ └────┘ └────┘ └────┘ └────┘ └────┘ │
└∊───────────────────────────────────┘
于 2014-07-22T11:32:15.623 回答