确定DNA序列的一部分的长度

时间:2016-02-09 16:24:16

标签: regex matlab

我正在接受DNA序列,例如:

  

ATTAGGGCCCATTACGCTGACGAGCACTTG

我需要编写一个函数,给定两个输入(DNA序列,A,C,G或T)确定仅包含该特定字母的序列中最长可能部分的长度。

dna = 'ATTAGGGCCCATTACGCTGACGAGCACTTG';
giveLength(dna, 'A') 
ans = 
       1
giveLength(dna, 'C') 
ans = 
       3    

我是这样开始的:

function length = giveLength(sequentce, amino)
[begin, end] = regexp(sequentie, amino , 'start', 'end')
pos = 1;                            
if isempty(begin)
    error('Doesn't exist!')
else
for i = 1:length(begin)
    if begin(i) ~= end(i)          
        if (end(i) - begin(i)) > (end(i) - begin(i)) || (end(i) - begin(i)) > 1
            pos = end(i) - begin(i);
        end
    end
end
length = pos;
end

显然这不起作用,因为对于每个字母,开始和起始位置是相同的,我不能写amino+让它选择对应的部分。

帮助将受到高度赞赏!

2 个答案:

答案 0 :(得分:1)

您可以从开始向量中减去end来获得匹配字符串的长度。查找最大值可获得最大长度。这个也更通用一点,因为你可以传递一个序列,如'AG',它将返回该模式的重复次数......

function len = giveLength(sequence, amino)
[begin_i, end_i] = regexp(sequence, sprintf('(%s)+', amino) , 'start', 'end');
if isempty(begin_i)
    error('Doesn''t exist!')
else
len = (max(end_i - begin_i) + 1) / numel(amino);

顺便说一句,尽量避免使用lengthend等变量名,这些名称可能是内部函数或关键字。

答案 1 :(得分:0)

我会use this answer并根据您的需要进行调整。

J=find(diff([dna(1)-1, dna]));
repetition=diff([J, numel(numCode)+1]);
symbol=dna(J)

现在完成这个小预处理,您可以查询某个符号的长度

max(repetition(symbol=='C'))