我正在接受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+
让它选择对应的部分。
帮助将受到高度赞赏!
答案 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);
顺便说一句,尽量避免使用length
,end
等变量名,这些名称可能是内部函数或关键字。
答案 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'))