我试图在矩阵中找到每行的最小值,不包括这些行中的特定元素。
特别是在给定的行中,我已经预先计算了我想包含在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
作为该行的结果。