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

C++ 如果瓶颈是一个大的矩阵乘法,我可以使用MEX文件来加速我的MATLAB代码吗?,c++,matlab,C++,Matlab,我有一个项目,需要我在while循环中多次设置两个大矩阵的乘法。对于较大的矩阵,代码可以运行得非常慢 我只是好奇在这一点上,使用mex和.cpp文件是否真的能提高我的程序的速度。内置的MATLAB矩阵乘法不是已经很好了吗?首先,我假设这些矩阵彼此相关,随时间或类似情况而变化。如果从一个实例到下一个实例的每个矩阵都是完全不相关的,那么这将无济于事。 然而,如果它们是相关的,我突然想到矩阵中的变化可能很小,甚至很稀疏。根据你的基本方程 C(i)=A(i)*B(i) 如果创建增量矩阵 Da=A(i+1

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


我只是好奇在这一点上,使用mex和.cpp文件是否真的能提高我的程序的速度。内置的MATLAB矩阵乘法不是已经很好了吗?

首先,我假设这些矩阵彼此相关,随时间或类似情况而变化。如果从一个实例到下一个实例的每个矩阵都是完全不相关的,那么这将无济于事。 然而,如果它们是相关的,我突然想到矩阵中的变化可能很小,甚至很稀疏。根据你的基本方程 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

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

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

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

  • 如果你的矩阵有任何类型的结构,利用它。Matlab对和矩阵有很好的支持。如果矩阵具有结构,使用它可以大大降低矩阵操作的成本

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


  • 您是通过循环将矩阵的单个元素相乘,还是通过循环将整个矩阵相乘多次?如果是前者,您应该尝试将MATLAB代码矢量化。如果是后者,你不可能看到任何加速将代码转换成C++的方法。如果您对BLAS和LAPACK库非常熟悉,您可能会有机会,但即使如此,它也可能不足以值得付出努力。这在很大程度上取决于MatLab版本和配置。MatLab的学生版似乎没有使用多线程矩阵乘法。@Praetorian我说的是通过循环多次执行整个矩阵乘法。对于大规模的问题,我可能不得不完全离开MATLAB。这真的太糟糕了,MATLAB有很多很好的功能。很难相信你能帮助加快MATLAB的矩阵乘法,请看这些问题了解更多信息:简短的回答-不。MATLAB的矩阵乘法例程将非常快。你能把你想做的事情贴出来吗?通常有一些方法可以实现矩阵乘法。