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



我得到了一个长度len的索引数组ind,它要么是0要么是1。我需要来自复杂且耗时的函数的结果func存储在结果向量res(也是长度len(。输入向量称为inp

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

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

我对第二个问题:对于那些ind 0的条目,MATLAB 是否评估func()?我希望不会,因为零乘以其他任何东西都是零,所以评估func是一种浪费.

对于 ind 为 0 的条目,您的第一个选项将不起作用,因为res(ind)会抛出错误:

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

无论如何,我认为这就是您正在寻找的:

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

它可能会,但这很容易通过制作一个打印到控制台的测试func进行测试,然后制作所有ind 0并查看它是否打印任何内容(我相信它会,但我没有 MATLAB 来检查自己(。

我希望没有,因为零倍是零。

不一定,0*inf呢?还是0*NaN

如果您的问题重点是哪个更有效,请使用timeit

最新更新