C 矩阵计算效率
C++ matrix computation efficiency
我们正在尝试优化我们的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
。如果您使用第一个选项,则特征肯定需要执行I
和M
的完整30x30减法(对于编译器来说,很难看到与您的第二个表达式的等效性(。总体而言,这将导致两个临时工(一个用于差异,一个用于产品(。
如果您实际使用的是I.Identity()
,则称为静态函数,例如成员函数,您的编译器至少应警告您。这实际上不会修改I
,并且您最终会在I
中获得非初始化的值,其中可能包括一些NAN或变性值,两者对于浮点性能都可能不利。当然,您的结果将是错误的。
总的来说,我认为编写方程式的最简单方法是
P -= M*P;
或
MatrixXd Pnew = P - M*P;
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 如何使用 std::累积在 C++ 中计算总和立方体
- 使用Qt C++计算类似Git的SHA1哈希
- OpenCV C++.快速计算混淆矩阵
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- C++如何计算用户输入的数字中的偶数位数
- 寻求提高Microsoft密封库计算效率的方法
- C 矩阵计算效率
- 在opencv中,使用垫子类型计算马氏距离太慢了。如何提高效率?
- 多线程计算均值和std并不能提高效率
- 提高了一个非常简单但用途广泛的函数(计算晶格中原子的邻居)的效率
- 计算效率高的C++-一般阅读
- 在c++中将两个相关的std::堆栈合并为std::map的计算效率如何?
- OpenCV: filter2D函数的计算效率