首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++矩阵计算效率

C++矩阵计算效率
EN

Stack Overflow用户
提问于 2017-04-25 00:02:40
回答 1查看 570关注 0票数 5

我们正在尝试优化我们的C++代码,我们有以下矩阵计算(使用本征库)

代码语言:javascript
复制
#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矩阵,而i是恒等矩阵。我们发现重写了上面的矩阵计算。

代码语言:javascript
复制
   P= (I- M)*P

作为

代码语言:javascript
复制
   P = P-M*P

在Linux系统中,使用gcc 6.2编译器实现了4-8x的加速。我意识到,编译器可能不知道任何关于恒等矩阵和I*P = P的事实,但仍然无法理解是什么使效率提高了很多。有谁知道作出如此重大改进的可能原因吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-25 08:45:54

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

如果您实际使用I.Identity(),您将调用一个静态函数,就像调用一个成员函数一样,您的编译器至少应该对此发出警告。这实际上不会修改I,您最终会在I中得到未初始化的值,这很可能包括一些NaN或去正态分布值,这对浮点性能都有影响。当然你的结果是错误的。

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

代码语言:javascript
复制
P -= M*P;

代码语言:javascript
复制
MatrixXd Pnew = P - M*P;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43599468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档