作为更大问题的一部分,在处理本征中的稀疏矩阵时,我遇到了性能瓶颈。

我需要从稀疏矩阵(x)中的每个元素中减去一个浮点数(G),包括系数为零的位置。因此零元素的值应为-x

我目前的操作方式如下:

//calculate G
x=0.01;
for(int i=0;i<rows;i++){
   for (int j=0; j<cols; j++) {
       G.coeffRef(i, j) -= x;
   }
}


当G的大小很大时,此简单的计算将成为瓶颈。

我还尝试将稀疏矩阵G转换为一个密集的矩阵,然后减去P(填充有值x的矩阵):

MatrixXd DenseG=MatrixXd(G);
x=0.01;
for(int i=0;i<rows;i++){
   for (int j=0; j<cols; j++) {
       DenseG(i, j) -= x;
   }
}


这种方法快得多。但是,我只是想知道是否还有其他解决方法不涉及将G转换为密集的方法,如果矩阵很大,则需要大量的内存。

最佳答案

从所有n^2元素中减去“稀疏”计算实际上是一种密集的计算。主要区别在于,不必对大量的内存执行单个操作,而是每次访问零元素时都必须为矩阵分配内存。通常,稀疏矩阵在稀疏时非常有效,并且对大多数操作而言会产生大量开销。仅需存储很少的元素即可平衡开销,因此,只需重复操作几次。

另一个可能的选择是利用Eigen's lazy evaluation的优势,但这有点取决于您的确切要求,在此未列出。

关于c++ - Eigen 程序中的性能瓶颈,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29795427/

10-11 18:10