2014-07-22 5 views
4

je le vecteur suivant Vec: ACGTTGCA et voudrait le diviser en un vecteur imbriqué, dans lequel les positions i-ième, il y aura un sous-segment de Vec de longueur 4, à partir du i-ème position de Vec.Dividing vecteur de caractères en segments

Par exemple, Vec[(⍳¯3+⍴Vec)∘.+¯1+⍳4] retours:

ACGT 
CGTT 
GTTG 
TTGC 
TGCA 

Mais le problème avec la sortie ci-dessus est qu'il est une matrice de caractère, alors que je voudrais obtenir la sortie suivante:

┌──────────────────────────┐ 
│┌────┬────┬────┬────┬────┐│ 
││ACGT│CGTT│GTTG│TTGC│TGCA││ 
│└────┴────┴────┴────┴────┘│ 
└──────────────────────────┘ 

Pour la chaîne suivante: vec←'Hy, only testing segmenting vec into pieces of 4' le bon résultat de ce que je cherchais serait:

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

De même, existe-t-il un moyen pour convertir un tel vecteur en un seul vecteur, dans lequel les lignes suivantes contiendraient 4 caractères?

Exemple: pour un vecteur de caractère foobartesting le résultat serait:

foob 
ooba 
obar 
bart 
arte 
rtes 
test 
esti 
stin 
ting 

Répondre

2

Ceci est testé dans GNU APL, mais je ne pense pas que cela devrait être différent dans Dyalog. Ma solution est aussi simple que cela:

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

Merci, je savais qu'il devait y avoir une solution plus facile (et plus rapide). – syntagma

+0

BTW, est-il un moyen de faire la même chose, à savoir créer un seul vecteur ressemblant à ça: 'foob \ nooba \ nobar \ n (...) \ nting' (édité ma question pour montrer ce que je demande) ? – syntagma

+0

Utilisez simplement le mon monadique. Cela prendra une liste de tableaux et en créera un tableau à deux dimensions. I.e, simplement faire '⊃ 4,/'foobartesting' devrait le faire. Je ne sais pas si je devrais mettre à jour la réponse pour couvrir cela? –

0

Je ne suis pas sûr que je ne comprends bien votre description. Mais ce que je compris est, vous avez un vecteur:

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

Oh, d'ailleurs, nous devons affecter le niveau de migration pour cette execise ;-)

⎕ml←3 

réponse modifiée après la compréhension de la question; -):

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

Merci, mais ce n'est pas exactement ce que je cherche. J'ai mis à jour ma question pour montrer comment je voudrais traiter votre exemple. – syntagma

+0

Ok, tx pour les détails supplémentaires - J'ai mis à jour ma réponse :) – MBaas

3

Pour revenir à votre question initiale: il vous suffit d'ajouter un chef de file « split » (↓) pour transformer votre matrice résultat dans le vecteur de vecteurs que vous êtes (étaient) à la recherche de. Notez que même si elle n'est pas aussi élégante, la solution «classique» basée sur la génération d'une matrice d'indices peut être beaucoup plus efficace, car cette réduction particulière n'est pas incluse dans la liste des cas optimisés par la plupart des interpréteurs APL.

Dans Dyalog APL v14.0/64 en cours d'exécution sur un processeur Intel Core i5 @ 1.60GHz:

x ← 'foobartesting'

(4,/x) exécute en environ 9,3 microsecondes

(↓ 4 {⍵ [(0, ⍳-⍺-⍴⍵) ∘. + ⍳⍺]} x) horloge vers 2,3

À mesure que la longueur du vecteur augmente, l'écart d'efficacité augmente; au moment où vous atteignez un argument de longueur 10 000, la réduction fenêtrée est presque 10 fois plus lente (7 vs 0,7 millisecondes).Dans l'APL Dyalog, l'efficacité de l'approche "classique" est améliorée par la disponibilité de types entiers de 1 octet et de 2 octets; votre kilométrage peut varier si vous utilisez d'autres interprètes APL.

Questions connexes