gpt4 book ai didi

c++ - Eigen :修改稀疏矩阵的三元组列表,而不是使用 coeffRef

转载 作者:行者123 更新时间:2023-11-30 03:31:11 61 4
gpt4 key购买 nike

我正面临组装 Eigen::SparseMatrix 的问题。实际上,它涉及一个有限元系统矩阵,通过遍历元素和积分点来组装。下面我把问题变得更抽象了。

我首先构造一个三元组列表来初始化矩阵(如 Eigen documentation 中所建议)。然后,我使用 coeffRef 在并发循环中执行汇编(参见下面的示例)。问题涉及 coeffRef“执行二进制搜索”这一事实,而我确切地知道每个项目在三元组列表中的位置(下面的 T)。更具体地说:

  • 以必须重新初始化稀疏矩阵为代价修改三元组列表以避免 coeffRef 是否更有效?

  • 如果要修改三元组列表中的一个值,有没有比这更优雅的东西

    T[i] = Trip(T[i].row(),T[i].col(),T[i].value()+X);

我意识到答案可能在很大程度上取决于矩阵的带宽(即搜索的成本),但对此可能有一些通用的说法。

例子

#include <iostream>
#include <Eigen/Sparse>

typedef Eigen::SparseMatrix<double> SpMat;
typedef Eigen::Triplet <double> Trip;

int main(void)
{
size_t N = 100;

SpMat A(N,N);

std::vector<Trip> T;
T.reserve(3*N);

for ( size_t i=0; i<N; ++i )
{
if ( i==0 ) T.push_back(Trip(i,i ,-1.0));
else T.push_back(Trip(i,i-1,-1.0));

T.push_back(Trip(i,i,+2.0));

if ( i==N-1 ) T.push_back(Trip(i,0 ,-1.0));
else T.push_back(Trip(i,i+1,-1.0));
}

A.setFromTriplets(T.begin(),T.end());

for ( size_t i=0; i<N; ++i )
A.coeffRef(i,i) += static_cast<double>(i);

return 0;
}

编译使用例如:

clang++ -I/usr/local/include/eigen3 test.cpp

最佳答案

我的猜测是,只要 coeffRef 访问的系数已经存在于矩阵中,那么调用 coeffRef 应该比从三元组列表重建矩阵更快。

您还可以通过使用 A.valuePtr()[A.outerIndexPtr()[i]+some_offset] += 直接访问底层数据结构来超越 coeffRef 执行的二进制搜索...,假设您可以利用已知结构直接计算 some_offset

最后,如果您需要更新所有条目,您还可以使用 InnerIterator it 按顺序迭代它们并使用 it.valueRef() += ...< 更新条目.

关于c++ - Eigen :修改稀疏矩阵的三元组列表,而不是使用 coeffRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44383625/

61 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com