如果起始向量很长或者重复次数足够大(见下文),则底线
bsxfun比你要求的更快,否则矩阵乘法更有效.在两者之间,你已经问过它看起来像矩阵乘法重塑在效率上比在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%(未显示):