Разделение вектора символов на сегменты
У меня есть следующий вектор 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
3 ответа
Это проверено в GNU APL, но я не думаю, что в Dyalog должно быть иначе. Мое решение так же просто, как это:
4 ,/ 'foobartesting'
foob ooba obar bart arte rtes test esti stin ting
Чтобы вернуться к исходному вопросу: вам нужно только добавить начальный "split" (↓), чтобы превратить ваш матричный результат в вектор векторов, которые вы (искали) искали. Обратите внимание, что, хотя это может быть не так элегантно, "классическое" решение, основанное на генерации матрицы индексов, может быть гораздо более эффективным, потому что это конкретное оконное сокращение не входит в список случаев, которые оптимизирует большинство интерпретаторов APL.
В Dyalog APL v14.0/64, работающем на Intel Core i5 @ 1.60Ghz:
х ← 'foobartesting'
(4, / x) выполняется примерно за 9,3 микросекунды
(↓4 {⍵[(0,⍳-⍺-⍴⍵)∘.+⍳⍺]} x) достигает около 2,3
По мере увеличения длины вектора разрыв в эффективности увеличивается; к тому времени, как вы достигнете аргумента длины 10 000, оконное сокращение будет почти в 10 раз медленнее (7 против 0,7 миллисекунды).
В Dyalog APL эффективность "классического" подхода повышается благодаря доступности 1-байтовых и 2-байтовых целочисленных типов; Ваш пробег может отличаться, если вы используете других переводчиков APL.
Я не уверен, что правильно понимаю ваше описание. Но я понял, что у вас есть вектор:
vec←'Hy, only testing segmenting vec into pieces of 4'
О, кроме того, нам нужно назначить уровень миграции для этого упражнения;-)
⎕ml←3
Модифицированный ответ после понимания вопроса;-):
display 4{⍺↑¨(0,⍳(⍴⍵)-⍺)↓¨⊂⍵}'ACGTTGCA'
┌→───────────────────────────────────┐
│ ┌→───┐ ┌→───┐ ┌→───┐ ┌→───┐ ┌→───┐ │
│ │ACGT│ │CGTT│ │GTTG│ │TTGC│ │TGCA│ │
│ └────┘ └────┘ └────┘ └────┘ └────┘ │
└∊───────────────────────────────────┘