任何关于比下面的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
答案 0 :(得分:5)
如果此功能占用了大部分处理时间,那几乎可以肯定是因为你多次调用它。反过来,这可能是因为您分别在向量或矩阵的每个元素上调用它。我建议更改函数以接受e
和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
该函数现在返回一个与输入矩阵大小相同的矩阵 - 对于单个元素,它将与当前版本完全相同,但对于更高维度的输入,它也可以工作,并且可能会给你一个很大的速度升压。
答案 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,因此速度测试不会有帮助)。但我认为会是。