我需要在非常大的Matlab中进行矩阵/向量乘法:“A”是一个655360乘5的实值矩阵,不一定是稀疏的,“B”是655360乘1的实值向量。我的问题是如何计算:B'* A有效。
我注意到通过计算A'* B来改善时间,这给出了一个列向量。但它仍然很慢(我需要在程序中多次执行此操作)。
通过一点点搜索,我找到了James Tursa的一个有趣的Matlab工具箱MTIMESX,我希望这会改善上面的矩阵乘法性能。经过几次试验,我只能在Matlab原生矩阵乘法上获得非常小的收益。
有关如何重写A'* B以使操作更有效的任何建议?感谢。
答案 0 :(得分:9)
Matlab的raison d'etre正在进行矩阵计算。如果你能用手工工具明显优于内置矩阵乘法,我会感到非常惊讶。首先,你应该确保你的乘法实际上可以更快地执行。你可以通过在C ++中使用Eigen实现类似的乘法来实现这一点。
答案 1 :(得分:3)
使用GPU
进行matlab矩阵乘法我得到了很好的结果答案 2 :(得分:1)
为了避免转置操作,您可以尝试:
sum(bsxfun(@times, A, B), 2)
但我会惊讶它比直接版本更快。请参阅@ thiton的回答。
另请查看http://www.mathworks.co.uk/company/newsletters/news_notes/june07/patterns.html,了解为什么基于列矢量的版本比基于行矢量的版本更快。
答案 3 :(得分:1)
Matlab是使用相当优化的库(BLAS等)构建的,因此您无法在Matlab中轻松改进它。您可以改进的地方是获得更好的BLAS,例如针对您的处理器优化的BLAS - 这将通过从主内存获取适当大小的数据块来更好地使用缓存。看一下创建自己编译的ATLAS,ACML,MKL和Goto BLAS版本。
我不会试图解决这个特定的乘法,除非它真的杀了你。改变BLAS可能会带来更快乐的解决方案,特别是如果您目前没有使用多核处理器。
答案 4 :(得分:0)
如果这是您的瓶颈,您的#1选项是重新检查您的算法。请参阅此问题Optimizing MATLAB code,了解选择不同算法如何将运行时间减少三个数量级的一个很好的例子。