2013-03-29 2 views
2

if else 함수보다 효율적인 솔루션에 대한 아이디어가 있습니까? 이것은 코드의 많은 부분을 차지하므로이를 줄여야합니다.else if 문을보다 효율적으로 만들 수 있습니까?

전체 기능은 그것을 만 확인할 수 있습니다 이런 식으로함으로써

 function result = vre(t,r,e,n,d) 
     if (e==4 && r>0) 
     result = 0; 
    elseif (e==4 && r==0) 
     result = 1; 
    elseif (e<4 && r==1) 
     result = t; 
    elseif (e<4 && r==2) 
     result = d;    
    else 
     result=n; 
    end 
end 
+0

switch 문을 고려 했습니까? http://www.mathworks.com/help/matlab/matlab_oop/functions-used-with-objects.html –

답변

5

이 기능이 처리 시간의 대부분을 차지하는 경우 너무 자주 호출하기 때문에 거의 확실합니다. 이것은 벡터 나 행렬의 각 요소에서 개별적으로 호출하기 때문에 가능합니다. 과 r에 대한 매트릭스 입력을 받아들이도록 함수를 변경하여 한번에 모든 검사를 수행 할 수 있습니다. matlab은 매트릭스 연산을 위해 만들어 졌으므로 항상 이점을 활용하는 것이 좋습니다.

function result = vre(t,r,e,n,d) 
#% add error checking for size of input args if desired 
result = ones(size(e))*n; #% default result; next assign special cases 
result(e==4 & r>0) = 0; #% note the single & for element-wise 'and' 
result(e==4 & r==0) = 1; 
result(e<4 & r==1) = t; 
result(e<4 & r==2) = d; 

end 

이 기능은 이제 입력 행렬과 같은 크기의 행렬을 반환 - 하나의 요소가 제공 아마 현재 버전으로,하지만 너무 작동합니다 높은 차원의 입력에 대해 정확히 같은 작동 할 것이다 당신에게 상당한 속도 향상.

+0

고마워요. @tmpearce – Mia

+0

너무 일찍 말하면 오류가 발생하여 행렬 크기가 일치해야합니다. . 루프를 꺼내서 "r"과 "e"열 벡터를 만들었습니다. "t", "n"및 "d"는 스칼라입니다. 왜 오류 – Mia

+0

@ 미아 왜'r'과'e' 벡터의 크기는 무엇입니까? 디버거를 사용하여 찾으십시오. – tmpearce

4
function result = vre(t,r,e,n,d) 
    if (e==4) { 
     if(r>0) 
      result = 0; 
     elseif (r==0) 
      result = 1; 
    } 
    elseif (e<4) { 
      if(r==1) 
       result = t; 
      elseif (r==2) 
       result = d; 
    }   
    else 
     result=n; 
    end 
end 

입니다 (예 == 4) 및 (e < 4) 번, 불필요한 검증을 피하는.

처리 시간이 절약되기를 바랍니다.

PS : MatLab을 설치하지 않았으므로 테스트하지 않았습니다.

2

이 시도 :

function result = vre(t,r,e,n,d) 
    if (e==4) 
    result = (r==0); 
    elseif (e<4) 
    result = (r==1)*t+(r==2)*d; 
    else 
    result=n; 
    end 
end 

내가 더 효율적 보장 할 수 없습니다 (I 오히려 MATLAB보다 옥타브 사용하므로 속도 테스트는 도움이 될 수 없음). 그러나 나는 그것이 될 것이라고 생각한다.

관련 문제