C++ 矩阵乘法优化

C++ 矩阵乘法优化,c++,eigen,C++,Eigen,我正在用相当大的矩阵执行一系列矩阵乘法。运行所有这些操作需要很长时间,我需要我的程序在一个大循环中完成。我想知道是否有人有任何想法来加快这一进程?我刚开始使用Eigen,所以我的知识非常有限 我使用的是ROOT cern内置的TMatrix类,但执行矩阵运算的速度非常差。我使用特征值建立了一些对角矩阵,希望它能以更优化的方式处理乘法运算。可能吧,但我真的看不出性能上的差异 // setup matrices int size = 8000; Eigen::MatrixXf a(size*2,s

我正在用相当大的矩阵执行一系列矩阵乘法。运行所有这些操作需要很长时间,我需要我的程序在一个大循环中完成。我想知道是否有人有任何想法来加快这一进程?我刚开始使用Eigen,所以我的知识非常有限

我使用的是ROOT cern内置的TMatrix类,但执行矩阵运算的速度非常差。我使用特征值建立了一些对角矩阵,希望它能以更优化的方式处理乘法运算。可能吧,但我真的看不出性能上的差异

// setup matrices
int size = 8000;

Eigen::MatrixXf a(size*2,size);

// fill matrix a....

Eigen::MatrixXf r(2*size,2*size); // diagonal matrix of row sums of a

// fill matrix r

Eigen::MatrixXf c(size,size); // diagonal matrix of col sums of a

// fill matrix c

// transpose a in place
a.transposeInPlace();

Eigen::MatrixXf c_dia;
c_dia = c.diagonal().asDiagonal();

Eigen::MatrixXf r_dia;
r_dia = r.diagonal().asDiagonal();

// calc car
Eigen::MatrixXf car;
car = c_dia*a*r_dia;

你在这里做的工作太多了。如果你有对角线矩阵,只存储对角线(直接用于产品)。一旦你把一个对角矩阵存储在一个方阵中,结构的信息就会丢失给本征矩阵

另外,您不需要存储
a
的转置变量,只需在产品内部使用
a.transpose()
(这只是一个小问题…)


最后,当然要确保编译时启用了优化,如果可用的话启用矢量化(使用gcc或使用
-O2-march=native
)编译)
Eigen::MatrixXf car=((a.transpose().array().rowwise()*a.colwise().sum()).colwise()*a.rowwise().sum()).matrix()
。你真的希望8000x8000矩阵乘以16000x8000会很快吗?除非你对矩阵的结构有所了解,而且有些东西是可以利用的,否则你获得适当速度的机会将微乎其微。我没想到它会很快。我希望我忽略了一些非常简单和明显的事情。看起来我是。谢谢你的评论!
// setup matrices
int size = 8000;

Eigen::MatrixXf a(size*2,size);

// fill matrix a....
a.setRandom();

Eigen::VectorXf r = a.rowwise().sum(); // diagonal matrix of row sums of a
Eigen::VectorXf c = a.colwise().sum(); // diagonal matrix of col sums of a

Eigen::MatrixXf car = c.asDiagonal() * a.transpose() * r.asDiagonal();