使用求解器 SparseLU 并出现错误 C2664
Using solver SparseLU and getting error C2664
我正在尝试使用 Eigen 解决 C++ 中的稀疏线性系统,我也在使用 Microsoft Visual Studio 2017。
使用 Eigen 的代码行如下:
Eigen::VectorXd x(sizeM), b(sizeM);
Eigen::SparseMatrix<double> A(sizeM, sizeM);
Eigen::SparseLU<Eigen::SparseMatrix<double, Eigen::ColMajor>, Eigen::COLAMDOrdering<Eigen::Index> > solver;
// M is my coefficient array and B is my independent vector.
for (int i = 0; i < sizeM; i++)
{
b(i) = B[i];
}
A.reserve(Eigen::VectorXi::Constant(sizeM, 6));
for (int i = 0; i < sizeM; i++)
{
for (int j = 0; j < sizeM; j++)
{
if (M[i][j] != 0)
{
A.insert(i,j) = M[i][j];
}
}
}
A.makeCompressed();
// Compute the ordering permutation vector from the structural pattern of A.
solver.analyzePattern(A);
// Compute the numerical factorization .
solver.factorize(A);
//Use the factors to solve the linear system .
x = solver.solve(b);
代码错误是这样的:
c:\users\bruno\desktop\c++ apps\eigen\eigen\src\sparselu\sparselu.h(421): error C2664: 'void Eigen::COLAMDOrdering<Eigen::Index>::operator ()<Eigen::SparseMatrix<double,0,int>>(const MatrixType &,Eigen::PermutationMatrix<-1,-1,StorageIndex> &)': cannot convert argument 2 from 'Eigen::PermutationMatrix<-1,-1,int>' to 'Eigen::PermutationMatrix<-1,-1,StorageIndex> &'
1> with
1> [
1> MatrixType=Eigen::SparseMatrix<double,0,int>,
1> StorageIndex=Eigen::Index
1> ]
1> and
1> [
1> StorageIndex=Eigen::Index
1> ]
1>c:\users\bruno\desktop\c++ apps\eigen\eigen\src\sparselu\sparselu.h(412): note: while compiling class template member function 'void Eigen::SparseLU<Eigen::SparseMatrix<double,0,int>,Eigen::COLAMDOrdering<Eigen::Index>>::analyzePattern(const Eigen::SparseMatrix<double,0,int> &)'
1>c:\users\bruno\desktop\c++ apps\project1\project1\main.cpp(386): note: see reference to function template instantiation 'void Eigen::SparseLU<Eigen::SparseMatrix<double,0,int>,Eigen::COLAMDOrdering<Eigen::Index>>::analyzePattern(const Eigen::SparseMatrix<double,0,int> &)' being compiled
1>c:\users\bruno\desktop\c++ apps\project1\project1\main.cpp(367): note: see reference to class template instantiation 'Eigen::SparseLU<Eigen::SparseMatrix<double,0,int>,Eigen::COLAMDOrdering<Eigen::Index>>' being compiled
1>Done building project "Project1.vcxproj" -- FAILED.
我是 Eigen 和 C++ 的新手,所以我不完全确定问题出在哪里。
简答,写:
Eigen::SparseLU<Eigen::SparseMatrix<double, Eigen::ColMajor>, Eigen::COLAMDOrdering<int> > solver;
或
Eigen::SparseLU<Eigen::SparseMatrix<double, Eigen::ColMajor, Eigen::Index>, Eigen::COLAMDOrdering<Eigen::Index> > solver;
其中 Eigen::ColMajor
在第一种情况下是可选的。
说明:Eigen::SparseMatrix
的最后一个模板参数定义了 StorageIndex
,它必须与 Eigen::COLAMDOrdering
相同。默认情况下,这是 int
(在大多数架构上是 32 位),而 Eigen::Index
是 std::ptrdiff_t
的类型定义,在 64 位架构上是 64 位。
我正在尝试使用 Eigen 解决 C++ 中的稀疏线性系统,我也在使用 Microsoft Visual Studio 2017。
使用 Eigen 的代码行如下:
Eigen::VectorXd x(sizeM), b(sizeM);
Eigen::SparseMatrix<double> A(sizeM, sizeM);
Eigen::SparseLU<Eigen::SparseMatrix<double, Eigen::ColMajor>, Eigen::COLAMDOrdering<Eigen::Index> > solver;
// M is my coefficient array and B is my independent vector.
for (int i = 0; i < sizeM; i++)
{
b(i) = B[i];
}
A.reserve(Eigen::VectorXi::Constant(sizeM, 6));
for (int i = 0; i < sizeM; i++)
{
for (int j = 0; j < sizeM; j++)
{
if (M[i][j] != 0)
{
A.insert(i,j) = M[i][j];
}
}
}
A.makeCompressed();
// Compute the ordering permutation vector from the structural pattern of A.
solver.analyzePattern(A);
// Compute the numerical factorization .
solver.factorize(A);
//Use the factors to solve the linear system .
x = solver.solve(b);
代码错误是这样的:
c:\users\bruno\desktop\c++ apps\eigen\eigen\src\sparselu\sparselu.h(421): error C2664: 'void Eigen::COLAMDOrdering<Eigen::Index>::operator ()<Eigen::SparseMatrix<double,0,int>>(const MatrixType &,Eigen::PermutationMatrix<-1,-1,StorageIndex> &)': cannot convert argument 2 from 'Eigen::PermutationMatrix<-1,-1,int>' to 'Eigen::PermutationMatrix<-1,-1,StorageIndex> &'
1> with
1> [
1> MatrixType=Eigen::SparseMatrix<double,0,int>,
1> StorageIndex=Eigen::Index
1> ]
1> and
1> [
1> StorageIndex=Eigen::Index
1> ]
1>c:\users\bruno\desktop\c++ apps\eigen\eigen\src\sparselu\sparselu.h(412): note: while compiling class template member function 'void Eigen::SparseLU<Eigen::SparseMatrix<double,0,int>,Eigen::COLAMDOrdering<Eigen::Index>>::analyzePattern(const Eigen::SparseMatrix<double,0,int> &)'
1>c:\users\bruno\desktop\c++ apps\project1\project1\main.cpp(386): note: see reference to function template instantiation 'void Eigen::SparseLU<Eigen::SparseMatrix<double,0,int>,Eigen::COLAMDOrdering<Eigen::Index>>::analyzePattern(const Eigen::SparseMatrix<double,0,int> &)' being compiled
1>c:\users\bruno\desktop\c++ apps\project1\project1\main.cpp(367): note: see reference to class template instantiation 'Eigen::SparseLU<Eigen::SparseMatrix<double,0,int>,Eigen::COLAMDOrdering<Eigen::Index>>' being compiled
1>Done building project "Project1.vcxproj" -- FAILED.
我是 Eigen 和 C++ 的新手,所以我不完全确定问题出在哪里。
简答,写:
Eigen::SparseLU<Eigen::SparseMatrix<double, Eigen::ColMajor>, Eigen::COLAMDOrdering<int> > solver;
或
Eigen::SparseLU<Eigen::SparseMatrix<double, Eigen::ColMajor, Eigen::Index>, Eigen::COLAMDOrdering<Eigen::Index> > solver;
其中 Eigen::ColMajor
在第一种情况下是可选的。
说明:Eigen::SparseMatrix
的最后一个模板参数定义了 StorageIndex
,它必须与 Eigen::COLAMDOrdering
相同。默认情况下,这是 int
(在大多数架构上是 32 位),而 Eigen::Index
是 std::ptrdiff_t
的类型定义,在 64 位架构上是 64 位。