Eigen Sparse LU求解器返回值

时间:2016-11-05 05:08:14

标签: 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):错误C2512:   “本征::内部::评价者&LT;征::斯帕塞夫克托&LT;复合物,0,长的长> &gt;':不   适当的默认构造函数

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

1 个答案:

答案 0 :(得分:1)

即使SparseLU::solve接受稀疏矩阵作为rhs,也没有特殊的路径,因为正如你也注意到的,在大多数情况下,结果仍然是dene。因此在内部,如果rhs是稀疏矩阵,则在实际求解之前将其内部转换为密集向量。然后丢弃数字零以输出稀疏矩阵。因此,在您的情况下,最好将Rhs复制到VectorXcd并让Solve返回密集的VectorXcd

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

相关问题