c++ - Eigen Sparse LU 求解器返回值

标签 c++ eigen eigen3

我对下面的代码有问题,经过一些研究我在单独的一行中挑出了这个问题,但现在不确定如何解决它。

typedef double ComplexType;

typedef std::complex<ComplexType> Complex;

typedef Eigen::SparseMatrix<Complex, Eigen::ColMajor, long long> SparseMatrixT; 

typedef Eigen::SparseVector<Complex, Eigen::ColMajor, long long> SparseVectorC;

typedef Eigen::SparseLU<SparseMatrixT, Eigen::COLAMDOrdering< long long>> SolverT;


SparseVectorC Solve(const Eigen::Ref<const SparseVectorC>& Rhs)
{
    auto _Result = m_LU.solve(Rhs); //SolverT m_LU; defined and "prepared" elsewhere

    SparseVectorC Result = _Result; // cause error C2512

    return Result;
}

错误显示

\eigen\src\core\solve.h(125): error C2512: 'Eigen::internal::evaluator< Eigen::SparseVector< Complex,0, long long > >': no appropriate default constructor available

我怎样才能在稀疏或密集 vector 中得到结果(因为它不像 Rhs 那样应该是稀疏的)。矩阵大小(可能)很大,因此额外的拷贝会令人不快。
变量 _Result 显然是稀疏的,但是对 Sparse 或 Dense vector 的赋值(有或没有强制转换)(使用可用方法 toDense() 可能是复制)都不起作用。

最佳答案

尽管SparseLU::solve接受稀疏矩阵作为 rhs,它们没有特殊路径,因为正如您也注意到的那样,在大多数情况下,结果无论如何都是定义的。所以在内部,如果 rhs 是稀疏矩阵,它会在实际求解之前在内部转换为密集 vector 。然后删除数字零以输出稀疏矩阵。所以在你的情况下,最好复制 RhsVectorXcdSolve返回一个密集的 VectorXcd也是。

要回答编译错误,这是 Eigen 中的一个问题(编辑:已在变更集 80c2b4346260 中修复)。如果您仍然想坚持使用稀疏的 rhs 和结果,那么您可以通过替换 Ref<const SparseVectorC> 来解决问题与 Ref<const SparseMatrixT> .与使用 SparseVectorC 相比不会有任何开销.

关于c++ - Eigen Sparse LU 求解器返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40434976/

相关文章:

c++ - 使用 MKL 编译时 Eigen C++ 运行速度变慢

c++ - 将 Eigen 类型与 STL 容器和 std::vector 一起使用

c++ - 右值引用的生命周期

C++ Eigen 将 arrayXXd 移动到 MatrixXd

c++ Eigen制作拷贝?

c++ - 如何使用 Cuda 将动态特征向量传递给 GPU?

c++ - 为什么我使用getline时cout打印了两次?

c++ - 到底是什么设置了 _WIN32 或 _WIN64 预处理器?

c++ - 显示对话框后运行函数

c++ - MatrixXd 和 VectorXd 之间的 Eigen C++ 矩阵乘法