2016-03-23 16 views
0

Matlabda bir işlev olarak needleman wunsh algoritmasını uygulamaya çalışıyorum. İşlev, aynı boyuttaki sekanslar için doğru şekilde çalışır ancak farklı boyutlarda, iki dizinin en yüksek uzunluğa sahip olduğu puan matrisini genişletir. Birisi bana bunun neden olduğunu söyleyebilir mi? Teşekkürler.needleman wunsh loop matlab'ı sonlandırmıyor

function [ mat, direction ] = build_score_mat(seq1, seq2) 
%BUILD_SCORE_MAT Takes two sequences and builds a score matrix for global 
%alignment 
m = length(seq1); 
n = length(seq2); 
mat = zeros(m+2,n+2); 
dir_mat = zeros(m+2,n+2); 
direction = zeros(m+2,n+2); 
mat(1,3:m+2) = seq1; 
mat(3:n+2,1) = seq2; 
mat(2,3:m+2) = -2:-2:-2*m; 
mat(3:n+2,2) = -2:-2:-2*n; 
for i=3:m+2  
    for j=3:n+2 
     if(mat(i,1) == mat(1,j)) 
      score = 5; %diagnol align 
     else 
      score = -1; 
     end 
     list = [mat(i-1,j-1)+score, mat(i,j-1)-2, mat(i-1,j)-2]; 
     [mat(i,j), dir_mat(i,j)]= max(list); 
     direction(i,j) = dir_mat(i,j); 
    end 
end 


end 
+0

"Seq1" ve "seq2" ve "mat", "output" girişleri nedir açıklayabilir misiniz? Bu işlevi nasıl kullanacağınızı anlamak için lütfen bir [MCVE] (http://stackoverflow.com/help/mcve) belirtin. – codeaviator

+0

seq1 ve seq2, hizalanacak dizelerdir. mat, hizalamadan sonra çıktı matrisidir ve yön, geri tepme için yönlendirme matrisinin, bunları girdi olarak alan başka bir işlev kullanılarak yapılacak hizalanmış kelimeleri/dizileri elde etmesini sağlayan yön matrisidir. –

cevap

0

Skor matrisini kopyalayan başka bir matris ekleyerek kendime bir geçici çözüm buldum. Fonksiyon şimdi mükemmel çalışıyor.

function [ matRet, direction ] = build_score_mat(seq1, seq2) 
%BUILD_SCORE_MAT Takes two sequences and builds a score matrix for global 
%alignment 
m = length(seq1); 
n = length(seq2); 
mat = zeros(m+2,n+2); 
matRet = zeros(m+2,n+2); 
dir_mat = zeros(m+2,n+2); 
direction = zeros(m+2,n+2); 
mat(1,3:m+2) = seq1; 
mat(3:n+2,1) = seq2; 
mat(2,3:m+2) = -2:-2:-2*m; 
mat(3:n+2,2) = -2:-2:-2*n; 
for i=3:m+2  
    for j=3:n+2 
     if(mat(i,1) == mat(1,j)) 
      score = 5; %diagnol align 
     else 
      score = -1; 
     end 
     list = [mat(i-1,j-1)+score, mat(i,j-1)-2, mat(i-1,j)-2]; 
     [mat(i,j), dir_mat(i,j)]= max(list); 
     matRet(i,j) = mat(i,j); 
     direction(i,j) = dir_mat(i,j); 
    end 
end 


end