【问题标题】:Eigen Sparse LU solver return valueEigen Sparse LU 求解器返回值
【发布时间】:2016-11-05 05:08:14
【问题描述】:

我对以下代码有问题,经过一些研究,我在单独的行中单独指出了问题,但现在不知道如何解决它。

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: 'Eigen::internal::evaluator>': 否 适当的默认构造函数可用

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

【问题讨论】:

    标签: c++ eigen eigen3


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-09
      • 2020-05-09
      • 2019-12-30
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多