【发布时间】:2017-10-19 18:22:47
【问题描述】:
我需要尽可能高效地实现一个非常大的乘法和求和运算。到目前为止,我发现的最佳方法是 MATLAB 中的bsxfun,我将问题表述为:
L = 10000;
x = rand(4,1,L+1);
A_k = rand(4,4,L);
tic
for k = 2:L
i = 2:k;
x(:,1,k+1) = x(:,1,k+1)+sum(sum(bsxfun(@times,A_k(:,:,2:k),x(:,1,k+1-i)),2),3);
end
toc
请注意,L 在实践中会更大。有没有更快的方法?奇怪的是,我需要先将单例维度添加到x,然后在其上添加sum,但否则我无法让它工作。
它仍然比我尝试过的任何其他方法快得多,但对于我们的应用程序来说还不够。听说 Python 函数 numpy.einsum 可能效率更高,但在考虑移植我的代码之前,我想先在这里问一下。
我正在使用 MATLAB R2017b。
【问题讨论】:
-
很多时候 for 循环比 bsxfun 快。但是您似乎已经尝试过了...?
-
矩阵乘法比
bsxfun快,但这似乎并不容易做到这一点 -
@LuisMendo 我考虑过将问题转换为稀疏矩阵乘法,但这有点令人生畏......你认为它会更快吗?
-
你用的是什么版本的 Matlab?
-
如果一个带有
bsxfun/隐式广播的运算可以直接转化为矩阵乘积,yes, it's faster。但是这里的转换可能需要太多时间
标签: python arrays matlab vectorization bsxfun