如果else语句更有效,我可以这样做吗?

时间:2013-03-29 02:31:29

标签: performance matlab if-statement

任何关于比下面的if else函数更有效的解决方案的想法?这花费了大部分时间用于代码,因此我需要减少它。

完整功能

     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

3 个答案:

答案 0 :(得分:5)

如果此功能占用了大部分处理时间,那几乎可以肯定是因为你多次调用它。反过来,这可能是因为您分别在向量或矩阵的每个元素上调用它。我建议更改函数以接受er的矩阵输入,这样您就可以立即执行所有检查 - 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

该函数现在返回一个与输入矩阵大小相同的矩阵 - 对于单个元素,它将与当前版本完全相同,但对于更高维度的输入,它也可以工作,并且可能会给你一个很大的速度升压。

答案 1 :(得分: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

通过这种方式,您只需验证(e == 4)和(e <4)一次,避免不必要的验证。

希望它节省一些处理时间。

PS:未测试,因为我没有安装MatLab。

答案 2 :(得分: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

我不能保证它更有效率(我使用八度音程而不是matlab,因此速度测试不会有帮助)。但我认为会是。