如果瓶颈是一个大的矩阵乘法,我可以使用MEX文件加速我的MATLAB代码吗?

时间:2013-03-10 00:47:40

标签: c++ matlab

我有一个项目要求我在while循环中多次设置两个大矩阵。使用更大的矩阵,代码可以运行得非常慢。

我只是好奇如果使用mex和.cpp文件可以真正提高程序的速度。内置的MATLAB矩阵乘法不是很好吗?

2 个答案:

答案 0 :(得分:3)

如果没有关于您的问题的更具体信息,任何人都可以说的具体事情很少。在某些情况下,MEX功能肯定可以提高性能,有些情况下它们不能。矩阵乘法是Matlab的优势之一,只需将矩阵乘法移动到MEX函数中就不太可能使代码运行得更快。

也就是说,有一些提高绩效的一般策略:

  1. Profile您的代码。确保矩阵乘法实际上是罪魁祸首。根据我自己的经验,性能问题可能来自各种来源,包括不小心使用临时变量。这应该是你的第一步。

  2. 如果您的矩阵有任何类型的结构,请利用它。 Matlab对sparsebanded矩阵有很好的支持。如果您的矩阵具有结构,使用它可以大大降低矩阵运算的成本。

  3. 如果您确实编写了MEX函数,请尝试将整个while循环移动到MEX函数中,以避免多次跨越Matlab / MEX边界。重复调用MEX函数可能非常昂贵,而且在MEX函数内部执行整个循环通常也很容易(或更容易),特别是如果循环是简单的迭代。

    < / LI>

答案 1 :(得分:0)

首先,我假设这些矩阵彼此相关,随着时间的推移或类似的情况发展。如果从一个实例到下一个实例的每个矩阵完全不相关,这将无济于事。 然而,如果它们是相关的,那么我发现矩阵的变化可能很小甚至是稀疏的。鉴于你的基本方程   C(i)= A(i)* B(i) 如果您创建delta矩阵   Da = A(i + 1) - A(i)   Db = B(i + 1) - B(i) 然后当然   C(i + 1)= C(i)+ Da * B(i)+ A(i)* Db + Da * Db 其中C(i)是已知的。如果Da和Db很小或稀疏,则这3个矩阵乘法可以快得多。它们甚至可能是正交的,并且最后一个项被删除,或者其结果被忽略为数量级的二阶。 只是一个想法。 Matlab矩阵问题有很多工具,不要放弃Matlab了!