2014-07-22 47 views
4

我有以下向量VecACGTTGCA并希望将它分成一个嵌套向量,其中第i个位置将有一个长度为4的Vec的子段,从Vec的第i位。将字符向量分成段

例如,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 

回答

2

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

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

谢谢,我知道必须有一个更容易(和更快)的解决方案。 – syntagma

+0

顺便说一句,有没有办法做类似的事情,即创建一个单一的向量看起来像这样:'foob \ nooba \ nobar \ n(...)\ nting'(编辑我的问题,以显示我所要求的) ? – syntagma

+0

只需使用monadic⊃即可。这将获取数组的列表并从中创建一个二维数组。也就是说,简单地做'⊃4','foobartesting''应该这样做。我不知道是否应该更新答案来涵盖此问题? –

0

我不知道我正确理解你的描述。 但我的理解是,你有一个载体:

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

哦,除此之外,我们需要分配迁移水平为这个execise ;-)

⎕ml←3 

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

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

谢谢,但它不完全是我在找的东西。我已更新我的问题以显示我将如何处理您的示例。 – syntagma

+0

好吧,tx的额外的细节 - 我更新了我的回复:) – MBaas

3

要回到你原来的问题:你只需要添加一个领先的“分裂”(↓)把你的矩阵导致到你是向量的向量(分别为) 寻找。请注意,虽然它可能不够优雅,但基于生成索引矩阵的“经典”解决方案可能效率更高,因为特定窗口缩减不在大多数APL解释器优化的案例列表中。

在Dyalog APL v14.0/64上的Intel酷睿@ 1.60GHz的运行:

X← 'foobartesting'

(4,/ X)在约9.3微秒

执行(↓4 {⍵[(0,⍺-⍴⍵-⍴⍵)∘。+⍳⍺]} x)时钟约为2.3

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

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