1

我有一个项目,需要我在 while 循环内多次设置两个大矩阵的乘法。对于较大的矩阵,代码运行速度会非常慢。

我很好奇此时使用 mex 和 .cpp 文件是否真的可以提高程序的速度。MATLAB内置的矩阵乘法不是已经很不错了吗?

4

2 回答 2

3

如果没有关于您的问题的更多具体信息,任何人都无法说出具体的内容。在某些情况下,MEX 函数肯定可以提高性能,而在某些情况下则不能。矩阵乘法是 Matlab 的优势之一,简单地将矩阵乘法移动到 MEX 函数中不太可能使您的代码运行得更快。

也就是说,有一些提高性能的一般策略:

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

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

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

于 2013-03-11T02:27:13.680 回答
0

首先,我假设这些矩阵彼此相关,随着时间的推移或类似的情况而演变。如果从一个实例到下一个实例的每个矩阵完全不相关,这将无济于事。但是,如果它们是相关的,我会想到矩阵的变化可能很小甚至稀疏。给定基本方程 C(i) = A(i)*B(i) 如果创建增量矩阵 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!

于 2013-03-10T03:29:18.683 回答