我对下面这段代码有疑问,经过一些研究后我单独列出了问题,但现在还不确定如何解决它。
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())都不起作用。
答案 0 :(得分:1)
即使SparseLU::solve
接受稀疏矩阵作为rhs,也没有特殊的路径,因为正如你也注意到的,在大多数情况下,结果仍然是dene。因此在内部,如果rhs是稀疏矩阵,则在实际求解之前将其内部转换为密集向量。然后丢弃数字零以输出稀疏矩阵。因此,在您的情况下,最好将Rhs
复制到VectorXcd
并让Solve
返回密集的VectorXcd
。
要回答编译错误,这是Eigen中的问题(编辑:已在变更集80c2b4346260中修复)。如果您仍想坚持使用稀疏的rhs和结果,那么您可以将Ref<const SparseVectorC>
替换为Ref<const SparseMatrixT>
来解决问题。与使用SparseVectorC
相比,不会有任何开销。