Performance Matlab中的快速矩阵乘法

Performance Matlab中的快速矩阵乘法,performance,matlab,matrix,matrix-multiplication,Performance,Matlab,Matrix,Matrix Multiplication,我需要在Matlab中制作一个非常大的矩阵/向量乘法:“a”是655360乘以5的实值矩阵,不一定是稀疏的,“B”是655360乘以1的实值向量。我的问题是如何有效地计算:B'*A 我注意到,通过计算a'*B,时间稍微有了改进,它给出了一个列向量。但它仍然非常慢(我需要在程序中执行多次此操作) 通过一点搜索,我找到了James Tursa编写的一个有趣的Matlab工具箱,我希望它能提高上述矩阵乘法性能。经过几次试验后,我只能获得比Matlab原生矩阵乘法非常小的收益 关于如何重写A'*B以提高

我需要在Matlab中制作一个非常大的矩阵/向量乘法:“a”是655360乘以5的实值矩阵,不一定是稀疏的,“B”是655360乘以1的实值向量。我的问题是如何有效地计算:B'*A

我注意到,通过计算a'*B,时间稍微有了改进,它给出了一个列向量。但它仍然非常慢(我需要在程序中执行多次此操作)

通过一点搜索,我找到了James Tursa编写的一个有趣的Matlab工具箱,我希望它能提高上述矩阵乘法性能。经过几次试验后,我只能获得比Matlab原生矩阵乘法非常小的收益


关于如何重写A'*B以提高操作效率,有什么建议吗?谢谢。

Matlab的存在理由是做矩阵计算。如果你能用手工制作的工具大大超越它内置的矩阵乘法,我会相当惊讶。首先,你应该确保你的乘法运算实际上可以执行得更快。可以通过在C++中与Eigen实现类似的乘法来实现这一点。

为了避免转置操作,可以尝试:

sum(bsxfun(@times, A, B), 2)
但我会感到惊讶的是,它比直接版本快。见@thiton的答案


另外,看看为什么基于列向量的版本比基于行向量的版本快。

我使用matlab矩阵乘法得到了很好的结果,如果这是您的瓶颈,那么您的#1选项是重新检查您的算法。有关如何选择不同算法将运行时间减少三个数量级的示例,请参见此问题。

Matlab是使用相当优化的库(BLAS等)构建的,因此您无法从Matlab内部轻松改进它。您可以改进的地方是获得更好的BLAS,例如为您的处理器优化的BLAS—这将通过从主内存获得大小适当的数据块来更好地使用缓存。看看如何创建自己的ATLAS、ACML、MKL和Goto BLAS编译版本


我不会试图解决这个乘法问题,除非它真的要杀了你。更改BLAS可能会带来更愉快的解决方案,特别是如果您目前没有使用多核处理器。

我认为对于矩阵运算,Matlab的性能已经接近您所能达到的最佳水平,因为矩阵运算已经被优化和并行化了。正如许多人在这里提到的那样,Matlab在处理这样的矩阵乘法时应该没有问题。然而,您的问题表明您的代码或系统有一些非常非常非常错误的地方:在我的i7机器上乘以这种大小的向量大约需要0.003秒。即使我们假设旧机器的速度慢300倍,计算时间也不到一秒钟!因为矩阵“a”只需要26MB的内存,所以不应该存在内存问题。谢谢。事实上,要打败原生的Matlab矩阵乘法是非常困难的。如果我将bsxffun与SumFun结合使用,则需要更多的时间。在新的Matlab版本中,并行计算能力似乎已与“gpuArray”之类的函数集成在一起。您能否对此进行详细说明?如何获得更好的BLAS,然后告诉Matlab使用它?如果有更好的BLAS可用,为什么Matlab还没有使用它?