我对这个功能完全不知所措。它是用MATLAB编写的,它应该基于Needleman-Wunsch矩阵给出DNA序列的最佳比对。这并不相关,因为据我所知,这与问题无关。
我不明白它一直出错的地方,因为它似乎只是犯了某种计算错误,我知道这是不可能的。
这就是函数。我知道这不是很有效,但我认为至少应该工作:
function [q1, q2, w] = traceback(D, seq1, seq2, g, S)
lengte = max(length(seq1), length(seq2)); % Preallocatie Q1 en Q2
q1 = char([]);
q2 = char([]);
w = D(length(seq1)+1,length(seq2)+1); % Bepaling w (laatste element van matrix D)
a = 0;
b = 0;
k = 0;
for i = length(seq1):-1:2
for j = length(seq2):-1:2
if D(i,j) == D(i,j-1) - g % Naar links = gap in seq1
q1 = ['-', q1];
q2 = [seq2(end-b), q2];
b = b+1;
k = k+1;
elseif D(i,j) == D(i-1,j) - g % Naar boven = gap in seq2
q1 = [seq1(end-a), q1];
q2 = ['-', q2];
a = a+1;
k = k+1;
else % Linksboven = match/puntmutatie
q1 = [seq1(end-a), q1];
q2 = [seq2(end-b), q2];
a = a+1;
b = b+1;
k = k+1;
end
if k == lengte
return
end
end
end
- 这些是放入其中的变量:**
seq1 = 'CGT';
seq2 = 'ACGT';
g = -5;
S = [10 -1 -3 -4; -1 7 -5 -3; -3 -5 9 0; -4 -3 0 8];
D =
0 -5 -10 -15 -20
-5 -3 4 -1 -6
-10 -6 -1 11 6
-15 -11 -6 6 19
(D是用另一个函数计算的,它肯定有效)
- 这就是我得到的:**
q1 = 'CG-T'
q2 = 'ACGT'
w = 19
- 这就是我应该得到的**
q1 = '-CGT'
q2 = 'ACGT'
w = 19
因此,在for-loop
s的第二次迭代期间,它似乎在第一个if-statement
处出错:
if D(i,j) == D(i,j-1) - g % Naar links = gap in seq1
此时应该转换为D(2,3)== D(2,2)-g,转换为4 ==-3 +5,这显然是不正确的,所以我不明白为什么它执行if
。
1条答案
按热度按时间dsekswqp1#
注解是正确的,使用调试器您将能够更容易地看到问题,并更好地解决未来的问题。现在,为了将此与您的问题的答案结合起来,让我们看看在这种情况下我们将如何进行。
首先,在您认为问题所在的行上放置一个断点(该行前面的小红点),在本例中,是traceback函数第11行的if语句。现在,您使用给定的参数运行函数。由于断点的存在,它将在if语句上暂停。现在,因为您认为问题出在第二次迭代中,所以单击Matlab IDE的编辑器选项卡中的“继续”。这将继续脚本,直到它再次到达if语句。
我们现在可以看到,您认为此时应该是什么情况,是不是实际情况。如果我这样做,我不会得到D(2,3)== D(2,2)-g,正如你在问题中假设的,而是D(3,3)== D(3,2)-g。这将在q1变量中添加一个“-”,而您不希望使用它。我们找到窃听器了!
现在开始识别哪里出错或意外的过程。我相信你会比我做得更好,因为你熟悉算法。祝你好运!