是否可以避免不必要的计算?

时间:2018-04-11 10:23:00

标签: matlab optimization lazy-evaluation

我得到了长度为ind的索引数组len,其为01。我需要将来自复杂且耗时的函数func的结果存储在结果向量res(也是长度len)中。输入向量称为inp

我可以通过以下两种方式做到这一点:

% 1st way:
res = zeros(len,1);
res(ind) = func(inp);

% 2nd way:
res = ind .* func(inp);

我对2 nd 的问题:对于ind0的那些条目,MATLAB是否评估func()?我希望不会,因为其他任何事情都是零,所以评估func是一种浪费。

2 个答案:

答案 0 :(得分:3)

对于ind为0的那些条目,您的第一个选项将无效,因为res(ind)将引发错误:

  

下标索引必须是实数正整数或逻辑。

无论如何,我认为这就是你要找的东西:

allowed_indices = ind > 0;   % Logical indexing of valid indices
res = zeros(len,1);
res(allowed_indices) = func(inp(allowed_indices));

答案 1 :(得分:1)

它可能会这样做,但是通过将测试func打印到控制台然后制作所有ind 0并查看是否打印,您可以轻松进行测试任何事情(我相信它会,但我没有MATLAB来检查自己)。

  

我希望不,因为零时间......否则为零

不一定,0*inf怎么办?或0*NaN

如果问题的重点更有效,请使用timeit

进行测试