2011-10-07 7 views
1

일반적으로이 함수는 1, 2, 3 또는 4 값을 제공해야합니다.하지만이 값을 사용하면 0, 1 또는 2가됩니다. 문제 :matlab에서 예기치 않은 결과가 발생했습니다

function Vecteur_retour = var_Test(Test) 

AA = Test; 

var_Test = zeros(1,2000); 

for i=3:1:2000 
    if AA(i)<=AA(i-1) && AA(i-1)<=AA(i-2) 
    var_Test(i)=1; 
    else 
    if AA(i)<=AA(i-1) && AA(i-1)>AA(i-2) 
    var_Test(i)=2; 
    if AA(i)>AA(i-1) && AA(i-1)<=AA(i-2) 
    var_Test(i)=3; 
    else 
    if AA(i)>AA(i-1) && AA(i-1)>AA(i-2) 
    var_Test(i)=4; 


    end 
    end 
    end 
    end 


end 


Vecteur_retour = var_Test; 

답변

2

아마 당신은 경우 var_Test(i) = 3 또는 var_Test(i) = 4에 도달하지 않기 때문에.

ifend 블록에 문제가 있습니다. 당신이 가지고있는 방법, 케이스 3은 케이스 2가 먼저 부딪 치는 경우에만 도달하지만, 이는 모순입니다.

코드가 더 필요합니다.

function Vecteur_retour = var_Test(Test) 

AA = Test; 
var_Test = zeros(1,2000); 

for i=3:1:2000   
    if AA(i)<=AA(i-1) && AA(i-1)<=AA(i-2) 
     var_Test(i)=1;   
    else 
     if AA(i)<=AA(i-1) && AA(i-1)>AA(i-2) 
      var_Test(i)=2; 
     else % you forgot this else 
      if AA(i)>AA(i-1) && AA(i-1)<=AA(i-2)   
       var_Test(i)=3; 
      else 
       if AA(i)>AA(i-1) && AA(i-1)>AA(i-2)   
        var_Test(i)=4;   
       end 
      end 
     end 
    end 
end 

Vecteur_retour = var_Test; 

신중한 들여 쓰기가 도움이되었을 것입니다.

+2

또는 더 나은 아직 ['elseif'] (http://www.mathworks.com/help/techdoc/ref/elseif.html) 키워드를 사용하여 . –

+0

정확히, 오류를 볼 수 있도록 OP와 가능한 유사하게 코드를 유지하려고했습니다. –

+0

@ Chris A. var_Test cases (i) = 3 및 var_Test (i) = 4, 존재합니다. case var_Test (i) = 0이 존재하지 않습니다. 코드에 문제가 있습니다. – bzak

3

벡터 비교는 훨씬 더 빨리 될 것입니다 :

var_Test = ones(1,2000); 

delta_Test = diff(Test); 
var_Test([0 0 delta_Test(1:end-1)] > 0) = 2; 
var_Test([0 delta_Test] > 0) = var_Test([0 delta_Test] > 0) + 2; 
var_Test(1:2) = 0; 
+0

+1. 내가하는 일에 아주 가깝다. –

관련 문제