我需要将列向量的一部分与固定的行向量相乘。我使用for循环解决了这个问题。但是,我想知道性能是否可以提高,因为我必须执行大约5000万次这种计算。到目前为止,这是我的代码:
multMat = 1:5;
mat = randi(5,10,1);
windowSize = 5;
vout = nan(10,1);
for r = windowSize : 10
vout(r) = multMat * mat( (r - windowSize + 1) : r);
end
我在想uisng arrayfun
。但是,首先我不知道如何添加单元格范围(即包括当前单元格的前五个单元格),其次,我不确定arrayfun
是否比使用循环更快?
答案 0 :(得分:3)
您正在描述的滑动向量乘法是所谓的convolution的示例。以下结果与示例中的循环产生相同的结果:
vout = [nan(windowSize-1,1);
conv(mat,flip(multMat),'valid')];
如果您的输出确实不需要循环中未覆盖的前导NaN
值,那么conv
表达式就足够了,而不会将NaN
元素连接到它。< / p>
对于足够大的向量,这当然不能保证你想要的那么快,但是MATLAB的内置卷积实现可能非常接近于该工作的最佳工具。