7 performance matlab matrix vectorization
我想以最快的方式找到没有任何NaN的行的索引,因为我需要做数千次.到目前为止,我尝试了以下两种方法:
find(~isnan(sum(data, 2)));
find(all(~isnan(data), 2));
Run Code Online (Sandbox Code Playgroud)
有没有一种聪明的方法可以加快速度,或者这是最好的方法吗?数据矩阵的维度通常为数百或数百.
编辑: 矩阵乘法可以比求和更快,因此对于超过 500 x500 元素的矩阵(在我的 Matlab 2012a 机器中),运算速度几乎快两倍。所以我的解决方案是:
find(~isnan(data*zeros(size(data,2),1)))
Run Code Online (Sandbox Code Playgroud)
在您在问题中建议的两种方法(用f和表示)中,第一种方法更快(使用):gtimeit
data=rand(4000);
nani=randi(numel(data),1,500);
data(nani)=NaN;
f= @() find(~isnan(sum(data, 2)));
g= @() find(all(~isnan(data), 2));
h= @() find(~isnan(data*zeros(size(data,2),1)));
timeit(f)
ans =
0.0263
timeit(g)
ans =
0.1489
timeit(h)
ans =
0.0146
Run Code Online (Sandbox Code Playgroud)