4

次のベクトルVec: ACGTTGCAがあり、ネストされたベクトルに分割したいと考えています。このベクトルでは、i 番目の位置に の i 番目の位置Vecから始まる長さ 4のサブセグメントがあり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

元の質問に戻るには、先頭の「分割」(↓) を追加して、行列の結果を探している (だった) ベクトルのベクトルに変換するだけです。それほどエレガントではないかもしれませんが、インデックスのマトリックスの生成に基づく「古典的な」ソリューションは、はるかに効率的である可能性があることに注意してください。

Intel Core i5 @ 1.60Ghz で実行されている Dyalog APL v14.0/64 の場合:

x←'フーバーテスト'

(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 に答える