重复向量的最有效方法是什么?
我目前的印象是 repmat
优于任何其他方法?还是我的这种心态大错特错了?
是否可以使用不同的技术产生与 repmat
完全相同的结果?也许是普通的矩阵乘法?
非常感谢您的关注和支持!
AER
最佳答案
底线,bsxfun
如果起始向量很长或重复次数足够大(见下文),则比您要求的两个更快,否则矩阵乘法效率更高。在您询问的两者之间,矩阵乘法+ reshape 在效率上比 repmat
高出约 3 倍。我用过 timeit
通过以下方式,我创建了一个包含 1e5 个元素的随机向量,并检查了创建 100 次重复需要多长时间:
v=rand(1e5,1);
f1=@()repmat(v,[100,1])
f2=@() reshape(v*ones(1,100),[],1);
timeit(f1)
ans =
0.1675
timeit(f2)
ans =
0.0516
然而 bsxfun
甚至更快:
f3=@() reshape(bsxfun(@times,v,ones(1,100)),[],1)
timeit(f3)
ans =
0.0374
下面是对这一观察的更仔细的研究:
给定一个向量有 1000 个元素长,将其重复 10 到 1e5 次会产生以下性能时间:
对于较小的重复次数,bsxfun
和矩阵乘法之间几乎没有区别,但随着重复次数超过 ~1e3,bsxfun
明显获胜。
但是,仅采用具有相同重复范围的 10 个元素长向量,表明矩阵乘法效率更高。 bsxfun
只有在 10^5 次重复后才开始变得更好,但即便如此它也只快了 ~5%(未显示):
所以这真的取决于你追求什么。更多讨论参见 Loren on the Art of MATLAB blog .
关于matlab - 在 Matlab 中重复向量的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16746999/