MATLAB中索引为0时是否执行耗时函数?能否避免冗余计算?
关于MATLAB中两种赋值方式的计算效率问题
先直接给你答案:第二种方式里,不管ind有多少元素是0,func(inp)都会被完整执行一遍,MATLAB不会因为后面要乘以0就跳过这部分计算。所以如果你想避免不必要的耗时计算,第二种方式完全做不到,甚至和第一种方式的原写法一样,都会执行完整的func(inp)。
为什么会这样?
MATLAB的运算逻辑是先计算所有子表达式,再执行最终的运算。对于res = ind .* func(inp),它的执行顺序是:
- 先调用
func(inp),得到完整的结果向量(长度和inp一致) - 再把这个结果向量和
ind做元素级乘法 - 最后把乘积结果赋值给
res
也就是说,哪怕ind里90%的元素都是0,func(inp)还是会老老实实处理整个输入向量,计算出所有结果后再乘以0丢弃——这完全是浪费你说的「复杂且耗时」的计算资源。
那怎么才能真正避免不必要的计算?
你原有的第一种方式res = zeros(len,1); res(ind) = func(inp);其实也没有避免,因为func(inp)还是处理了整个输入。想要只计算ind为1对应的部分,你需要把inp中对应ind为1的子集传给func,写法应该改成:
res = zeros(len,1); res(ind) = func(inp(ind));
这样func只会处理inp中需要保留结果的那些元素,完全跳过ind为0对应的部分,真正实现了避免不必要计算的目的。
两种原写法的区别
最后补充下你给出的两种原写法的差异:
- 第一种是先初始化全0向量,再把
func(inp)的结果赋值给ind为1的位置 - 第二种是先计算
func(inp)的全量结果,再和ind相乘得到最终向量
两者的共同点是都会完整执行func(inp),所以在计算效率上没有区别,只是赋值逻辑不同而已。
内容的提问来源于stack exchange,提问作者Kapa11
相关产品推荐
相关产品推荐

