C 矩阵计算效率

C++ matrix computation efficiency

本文关键字:效率 计算      更新时间:2023-10-16

我们正在尝试优化我们的C 代码,并且我们具有以下矩阵计算(使用eigen库(

#include<Eigen/Dense>
int main(){
   MatrixXd P = MatrixXd::Random(30,30); // a  random double 30 x 30 matrix P
   MatrixXd M = MatrixXd::Random(30,30); // a  random double 30 x 30 matrix M
   Matrix<double, 30, 30> I; 
   I.setIdentity(); // I is an 30 x 30 identity matirx
   P = (I-M)*P
   return 0;
   }

它们都是NXN矩阵,而我是身份矩阵。 我们发现上述矩阵计算的重写

   P= (I- M)*P

AS

   P = P-M*P

使用GCC 6.2编译器,在Linux Ubuntu系统中导致〜4-8X速度。我意识到,编译器可能对身份矩阵和事实I*p = P一无所知,但仍然无法围绕使效率提高太大的原因。任何人都知道做出如此重大改进的可能原因吗?

首先,I.identity();不存在。您想要的是I.setIdentity()P = (MatrixXd::Identity(30,30)-M)*P。如果您使用第一个选项,则特征肯定需要执行IM的完整30x30减法(对于编译器来说,很难看到与您的第二个表达式的等效性(。总体而言,这将导致两个临时工(一个用于差异,一个用于产品(。

如果您实际使用的是I.Identity(),则称为静态函数,例如成员函数,您的编译器至少应警告您。这实际上不会修改I,并且您最终会在I中获得非初始化的值,其中可能包括一些NAN或变性值,两者对于浮点性能都可能不利。当然,您的结果将是错误的。

总的来说,我认为编写方程式的最简单方法是

P -= M*P;

MatrixXd Pnew = P - M*P;