在Matlab中实现快速矩阵乘法

4
我需要在Matlab中进行非常大的矩阵/向量乘法: "A"是一个655360×5的实值矩阵,不一定是稀疏的,而"B"是一个655360×1的实值向量。我的问题是如何高效地计算:B'* A。
我已经注意到通过计算A'* B可以略微提高时间,这会给出一个列向量。但仍然很慢(我需要在程序中执行此操作多次)。
通过一点搜索,我发现了James Tursa的一个有趣的Matlab工具箱MTIMESX,希望它可以提高上述矩阵乘法的性能。经过几次尝试,我只能获得与Matlab本机矩阵乘法相比非常微小的增益。
有关如何重写A'* B以使操作更有效的任何建议?谢谢。

1
我认为对于矩阵运算,Matlab 的性能已经接近最佳水平了,因为矩阵运算已经被优化和并行化了。 - jpjacobs
正如许多人在这里提到的,Matlab应该没有问题处理这样的矩阵乘法。然而,你的问题表明你的代码或系统有非常非常严重的问题:在我的i7机器上,这个大小的向量相乘大约需要0.003秒。即使我们假设旧机器慢300倍,计算也应该在一秒内完成!由于矩阵“A”只需要26 MB的内存,所以也不应该存在内存问题。 - Yanir Kleiman
5个回答

10

Matlab的存在意义在于进行矩阵计算。如果你想用手工工具显著优化其内置的矩阵乘法,我会感到相当惊讶。首先,你应该确保你的乘法确实可以显著地更快地执行。你可以通过使用Eigen在C++中实现类似的乘法来做到这一点。


3

我使用GPU在matlab中进行矩阵乘法,取得了良好的结果。


2
新版的Matlab似乎已经集成了并行计算能力,其中一些函数如“gpuArray”。 - Cowboy

1

谢谢。确实很难超越原生的Matlab矩阵乘法。如果我使用bsxfun和sum一起,需要更多时间。 - Cowboy

1

Matlab是使用相当优化的库(BLAS等)构建的,因此你不能轻易地在Matlab内部改进它。你可以改进的地方是获取更好的BLAS,比如针对你的处理器进行优化的BLAS - 这将通过从主存中获取适当大小的数据块来更好地利用缓存。研究一下创建自己编译版本的ATLAS、ACML、MKL和Goto BLAS。

除非这个特定的乘法问题真的让你很困扰,否则我不会尝试解决它。改变BLAS很可能会带来更好的解决方案,特别是如果你目前没有利用多核处理器。


你能详细说明一下吗?我如何获得更好的BLAS并告诉Matlab使用它?如果有更好的BLAS可用,为什么Matlab不会自动使用它呢? - littleO

0

如果这是您的瓶颈,您的首选方案是重新审查您的算法。请参考此问题优化MATLAB代码,这是一个很好的例子,说明选择不同的算法可以将运行时间缩短三个数量级。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接