首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Eigen程序的性能瓶颈

Eigen程序的性能瓶颈
EN

Stack Overflow用户
提问于 2015-04-22 18:59:20
回答 2查看 274关注 0票数 0

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

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

目前我这样做的方式如下:

代码语言:javascript
复制
//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的矩阵):

代码语言:javascript
复制
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转换为密集矩阵的解决方案,这在非常大的矩阵的情况下需要大量的内存。

EN

回答 2

Stack Overflow用户

发布于 2015-04-22 19:15:21

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

另一个可能的选择是利用Eigen's lazy evaluation,但这在某种程度上取决于您的确切需求,您没有在这里列出这些需求。

票数 3
EN

Stack Overflow用户

发布于 2015-04-24 10:57:26

正如Avi Ginsburg所说,这种操作导致密集矩阵松散了G-X的所有结构,其中G是初始稀疏矩阵,X是填充了x的抽象密集矩阵。

我建议您尝试在算法的其余部分中将这两个项分开,并更新数学以利用这种特殊结构。例如,如果下一步是将其乘以密集向量v,那么您可以有利地利用这一点:

代码语言:javascript
复制
(G-X)*v == (G*v).array()-v.sum()*x
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29795427

复制
相关文章

相似问题

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