使用C+中的特征库定义并填充稀疏矩阵+; 我试图用C++中的特征或ARMADILO库来构造一个SPARS矩阵,以求解线性方程组AX= B。A是维数为n*n的系数矩阵,B是维数为n的右侧向量 我看过了本征文档,但是在C++中定义和填充SPARS矩阵有问题。p> 你能给我一个例子来定义SPARS矩阵,以及如何用C++中的特征库将这些值填充到矩阵中?
例如,考虑一个简单的Spar矩阵a: 120 0 3 0 0 045 067使用C+中的特征库定义并填充稀疏矩阵+; 我试图用C++中的特征或ARMADILO库来构造一个SPARS矩阵,以求解线性方程组AX= B。A是维数为n*n的系数矩阵,B是维数为n的右侧向量 我看过了本征文档,但是在C++中定义和填充SPARS矩阵有问题。p> 你能给我一个例子来定义SPARS矩阵,以及如何用C++中的特征库将这些值填充到矩阵中?,c++,eigen,C++,Eigen,例如,考虑一个简单的Spar矩阵a: 120 0 3 0 0 045 067 int main() { SparseMatrix<double> A; // fill the A matrix ???? VectorXd b, x; SparseCholesky<SparseMatrix<double> > solver; solver.compute(A); x = solver.solve(
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;
}
intmain()
{
SparseMatrix A;
//填写A矩阵????
向量xd b,x;
SparseCholesky解算器;
计算(A);
x=解算器解算(b);
返回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;
}
SparseMatrix fillMatrix(){
int N=4;
int M=4;
SparseMatrix m1(N,M);
m1.reserve(VectorXi::Constant(M,4));//4:每列非零实体的估计数
m1.系数ref(0,0)=1;
m1.系数ref(0,1)=2。;
m1.系数ref(1,1)=3。;
m1.系数ref(2,2)=4。;
m1.系数ref(2,3)=5。;
m1.系数ref(3,2)=6。;
m1.系数ref(3,3)=7。;
m1.makeCompressed();
返回m1;
}
但是,在这种情况下,SparseCholesky
模块(simplicalcholesky
)不起作用,因为矩阵不是Hermitian。系统可以用LU或BiCGStab解算器求解。还要注意,需要定义x
和b
的大小:
向量xd b(A.rows()),x(A.cols())代码>
对于较大的稀疏矩阵,您可能还需要查看
.reserve()
函数,以便在填充元素之前分配内存。.reserve()
函数可用于估计每列(或每行,取决于存储顺序)的非零条目数。默认值为comumn major。在上面的例子中,估计值是4,但在这样一个小的矩阵中它没有意义。文档中指出,最好是。因为这个问题也涉及到,下面是相应的基于犰狳的代码。最好使用Armadillo 9.100+或更高版本,并与SuperLU链接
#include <armadillo>
using namespace arma;
int main()
{
sp_mat A(4,4); // don't need to explicitly reserve the number of non-zeros
// fill with direct element access
A(0,0) = 1.0;
A(0,1) = 2.0;
A(1,1) = 3.0;
A(2,2) = 4.0;
A(2,3) = 5.0;
A(3,2) = 6.0;
A(3,3) = 7.0; // etc
// or load the sparse matrix from a text file with the data stored in coord format
sp_mat AA;
AA.load("my_sparse_matrix.txt", coord_ascii)
vec b; // ... fill b here ...
vec x = spsolve(A,b); // solve sparse system
return 0;
}
行和列计数从零开始。例如:
0 0 1.0
0 1 2.0
1 1 3.0
2 2 4.0
2 3 5.0
3 2 6.0
3 3 7.0
1000 2000 9.0
未明确列出的值假定为零。非常感谢,这很有用。是的,它是非常非常大的Spar矩阵。你能解释一下.reserve()吗?@mortezaaminaji我添加了
.reserve()
的解释和示例,以及一个带有详细描述的链接。我很高兴听到你觉得我的答案很有用,但在这个网站上表达对有用答案的感激之情的既定方式是对它进行投票,如果它解决了问题,就接受它。你读过文档中的“填充稀疏矩阵”部分吗?只需遵循第一个基于三元组的示例:。本页甚至包含一个完整的组装和求解拉普拉斯方程的示例:。
0 0 1.0
0 1 2.0
1 1 3.0
2 2 4.0
2 3 5.0
3 2 6.0
3 3 7.0
1000 2000 9.0