gpt4 book ai didi

c++ - 使用 C++ 中的 Eigen 库定义和填充稀疏矩阵

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

我正在尝试使用 C++ 中的 Eigen 或 Armadillo 库构建一个 spars 矩阵来求解线性方程组 Ax=b。 A是n*n维的系数矩阵,B是右手边的n维 vector the Spars Matrix A is like this, see the figure

我查看了 Eigen 文档,但我在用 C++ 定义和填充 Spars 矩阵时遇到了问题。

能否给我一个示例代码来定义 spars 矩阵以及如何使用 C++ 中的 Eigen 库将值填充到矩阵中?

例如考虑一个简单的 spars 矩阵 A:

1 2 0 0

0 3 0 0

0 0 4 5

0 0 6 7

int main()
{
SparseMatrix<double> A;

// fill the A matrix ????

VectorXd b, x;
SparseCholesky<SparseMatrix<double> > solver;
solver.compute(A);

x = solver.solve(b);
return 0;
}

最佳答案

可以使用 .coeffRef() 将帖子中提到的值填充到稀疏矩阵中成员函数,如本例程所示:

SparseMatrix<double> fillMatrix() {
int N = 4;
int M = 4;
SparseMatrix<double> m1(N,M);
m1.reserve(VectorXi::Constant(M, 4)); // 4: estimated number of non-zero enties per column
m1.coeffRef(0,0) = 1;
m1.coeffRef(0,1) = 2.;
m1.coeffRef(1,1) = 3.;
m1.coeffRef(2,2) = 4.;
m1.coeffRef(2,3) = 5.;
m1.coeffRef(3,2) = 6.;
m1.coeffRef(3,3) = 7.;
m1.makeCompressed();
return m1;
}

然而,SparseCholesky模块 ( SimplicialCholesky<SparseMatrix<double> >) 在这种情况下不起作用,因为矩阵不是 Hermitian 矩阵。该系统可以用 LU 或 BiCGStab 求解器求解。另请注意 x 的大小和 b需要定义: VectorXd b(A.rows()), x(A.cols());

如果是较大的稀疏矩阵,您可能还需要查看 .reserve()函数以便在填充元素之前分配内存。 .reserve()函数可用于估计每列(或行,取决于存储顺序。默认为 comumn-major)的非零条目数。在上面的示例中,估计值为 4,但在如此小的矩阵中没有意义。文档指出它优于 overestimate the number of non-zeros per column .

关于c++ - 使用 C++ 中的 Eigen 库定义和填充稀疏矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52355323/

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