自己的稀疏 LU 求解器 return 值
Eigen Sparse LU solver return value
我对下面的代码有问题,经过一些研究我在单独的一行中挑出了这个问题,但现在不确定如何解决它。
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
如何在稀疏或密集向量中获得结果(因为它不像 Rhs 那样应该是稀疏的)。矩阵大小(可能)很大,所以额外的副本会令人不快。
变量 _Result 显然是稀疏的,但是对 Sparse 或 Dense 向量的赋值(有或没有强制转换)(使用可用方法 toDense() 可能是复制)都不起作用。
即使 SparseLU::solve
接受稀疏矩阵作为 rhs,它们也没有特殊的路径,因为正如您也注意到的那样,在大多数情况下结果无论如何都是定义的。所以在内部,如果 rhs 是稀疏矩阵,它会在实际求解之前在内部转换为密集向量。然后删除数字零以输出稀疏矩阵。因此,在您的情况下,最好将 Rhs
复制到 VectorXcd
并让 Solve
returns 也成为密集的 VectorXcd
。
要回答编译错误,这是 Eigen 中的一个问题(编辑:已在变更集 80c2b4346260 中修复)。如果您仍想坚持使用稀疏 rhs 和结果,则可以通过将 Ref<const SparseVectorC>
替换为 Ref<const SparseMatrixT>
来解决此问题。与使用 SparseVectorC
.
相比,不会有任何开销
我对下面的代码有问题,经过一些研究我在单独的一行中挑出了这个问题,但现在不确定如何解决它。
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
如何在稀疏或密集向量中获得结果(因为它不像 Rhs 那样应该是稀疏的)。矩阵大小(可能)很大,所以额外的副本会令人不快。
变量 _Result 显然是稀疏的,但是对 Sparse 或 Dense 向量的赋值(有或没有强制转换)(使用可用方法 toDense() 可能是复制)都不起作用。
即使 SparseLU::solve
接受稀疏矩阵作为 rhs,它们也没有特殊的路径,因为正如您也注意到的那样,在大多数情况下结果无论如何都是定义的。所以在内部,如果 rhs 是稀疏矩阵,它会在实际求解之前在内部转换为密集向量。然后删除数字零以输出稀疏矩阵。因此,在您的情况下,最好将 Rhs
复制到 VectorXcd
并让 Solve
returns 也成为密集的 VectorXcd
。
要回答编译错误,这是 Eigen 中的一个问题(编辑:已在变更集 80c2b4346260 中修复)。如果您仍想坚持使用稀疏 rhs 和结果,则可以通过将 Ref<const SparseVectorC>
替换为 Ref<const SparseMatrixT>
来解决此问题。与使用 SparseVectorC
.