查找最小元素子集的有效方法



我试图在矩阵中找到每行的最小值,不包括这些行中的特定元素。

特别是在给定的行中,我已经预先计算了我想包含在valid(i,:)中的那些元素。

正确的方法是什么,以下是我想到的选项:

for i = 1:n
res(i) = min(x(i, 1, valid(i,:)), [], 3);
...
end

根据我对 matlab 的了解,这会更有效:

res = min(x(:, 1, valid), [], 3);

但是,这将仅将单个过滤器应用于第三维度...

您可以使用accumarray执行以下操作。不确定它是否会比你的答案更快:

[~, jj] =  find(valid); % column indices, to be used as grouping variable
res = accumarray(jj, x(valid), [size(x,2) 1], @min, NaN); % NaN used as fill value

玩了一会儿之后,事实证明,利用 matlab 处理NaN值的方式非常有效。

具体在这种情况下:

xp = x;
xp(~valid) = NaN;
res = min(xp,[],3);

这给出了大约 100 倍的保守加速,因为以前的版本(显式循环(每次迭代需要 ~10 秒,现在 100 次迭代需要 ~5 秒。

注意:有一种边缘情况,如果没有任何有效元素,那么您最终会得到NaN作为该行的结果。

最新更新