2015-11-26 11 views
3

我正在研究MATLAB中的一個函數,該函數比較兩個基因序列並確定它們的相似性。爲此,我通過使用for循環遍歷它們,將兩個序列分割成更小的子串,一次移動一個核苷酸,並將子串添加到單元陣列中。在MATLAB中將長字符串拆分爲子字符串的最有效方法

因此,例如,爲4子長度字符串ATGCAAAT不會被分割

ATGC,AAAT

而是作爲

ATCG,TGCA,GCAA,CAAA,AAAT

我試圖讓這個函數的執行速度更快,而且因爲這兩個for循環提供了將近90%的執行時間,所以我想知道是否在MATLAB中有更快的方法來執行此操作。

這裏是代碼我目前正在使用:

SubstrSequence1 = {};             
SubstrSequence2 = {}; 
for i = 1:length(Sequence1)-(SubstringLength-1)     
    SubstrSequence1 = [SubstrSequence1, Sequence1(i:i+SubstringLength-1)]; 
end 

for i = 1:length(Sequence2)-(SubstringLength-1)     
    SubstrSequence2 = [SubstrSequence2, Sequence2(i:i+SubstringLength-1)]; 
end 

回答

3

這個怎麼樣?

str = 'ATGCAAAT'; 
n = 4; 
strs = str(bsxfun(@plus, 1:n, (0:numel(str)-n).')); 

結果是2D char數組

strs = 
ATGC 
TGCA 
GCAA 
CAAA 
AAAT 

所以局部字符串是strs(1,:)strs(2,:)

如果希望結果作爲字符串的細胞arrray,最後加上:

strs = cellstr(strs); 

生產

strs = 
    'ATGC' 
    'TGCA' 
    'GCAA' 
    'CAAA' 
    'AAAT' 

,然後部分列有strs{1}strs{2}

+1

非常感謝,這個偉大的工程。它比我的循環快了約3倍,並且比這裏的其他建議稍微快一點。 – dacm

+0

很高興! –

2

下面是使用hankel得到SubstrSequence1一種方法 -

A = 1:numel(Sequence1); 
out = cellstr(Sequence1(hankel(A(1:SubstringLength),A(SubstringLength:end)).')) 

您可以按照相同的步驟找到SubstrSequence2

採樣運行 -

>> Sequence1 = 'ATGCAAAT'; 
>> SubstringLength = 4; 
>> A = 1:numel(Sequence1); 
>> cellstr(Sequence1(hankel(A(1:SubstringLength),A(SubstringLength:end)).')) 
ans = 
    'ATGC' 
    'TGCA' 
    'GCAA' 
    'CAAA' 
    'AAAT' 
+0

我用'hankel'開始了,但無法使它工作! –

+0

@LuisMendo我以bsxfun開始,但爲時已晚! :) – Divakar

+0

我確信你已經開始了:-P –

1

一種方法是生成指數的矩陣適當地提取你想要的字符串:

>> sequence = 'ATGCAAAT'; 
>> subSequenceLength = 4; 
>> numSubSequence = length(sequence) - subSequenceLength + 1; 
>> idx = repmat((1:numSubSequence)', 1, subSequenceLength) + repmat(0:subSequenceLength-1, numSubSequence, 1); 
>> result = sequence(idx) 

    result = 

     ATGC 
     TGCA 
     GCAA 
     CAAA 
     AAAT 
相關問題