如何排除返回错误结果的MATLAB代码

rdlzhqv9  于 2023-06-23  发布在  Matlab
关注(0)|答案(1)|浏览(146)

我对这个功能完全不知所措。它是用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

dsekswqp

dsekswqp1#

注解是正确的,使用调试器您将能够更容易地看到问题,并更好地解决未来的问题。现在,为了将此与您的问题的答案结合起来,让我们看看在这种情况下我们将如何进行。
首先,在您认为问题所在的行上放置一个断点(该行前面的小红点),在本例中,是traceback函数第11行的if语句。现在,您使用给定的参数运行函数。由于断点的存在,它将在if语句上暂停。现在,因为您认为问题出在第二次迭代中,所以单击Matlab IDE的编辑器选项卡中的“继续”。这将继续脚本,直到它再次到达if语句。
我们现在可以看到,您认为此时应该是什么情况,是不是实际情况。如果我这样做,我不会得到D(2,3)== D(2,2)-g,正如你在问题中假设的,而是D(3,3)== D(3,2)-g。这将在q1变量中添加一个“-”,而您不希望使用它。我们找到窃听器了!
现在开始识别哪里出错或意外的过程。我相信你会比我做得更好,因为你熟悉算法。祝你好运!

相关问题