我如何将本特征求解器作为班级成员缓存
How do I cache an Eigen solver as a class member?
我有一些几何数据,通过求解某些昂贵的线性系统,我的顶点是我移动的。我想在函数调用之间重复使用该系统,因此我试图将其封装为可以将其提供给我正在使用的几何框架的课堂成员,但是我不知道如何命名求解器的类型。
我这样获得求解器:
#include "./eigen3/Eigen/Sparse"
#include "./eigen3/Eigen/SparseCore"
#include "./eigen3/Eigen/SparseCholesky"
Eigen::SimplicialLDLT<Eigen::SparseMatrix<double>> sparseSolver(mySPDMatrix);
所以我的第一个想法是写这样的课(一些成员省略):
class MatrixCachePerObjectData : public PerObjectData /* 'PerObjectData' is required by the framework */
{
public:
Eigen::SimplicialLDLT<Eigen::SparseMatrix<double>> cached_solver;
MatrixCachePerObjectData(Eigen::SimplicialLDLT<Eigen::SparseMatrix<double>> cs) : cached_solver(cs) {}
};
不会编译的。从那以后,我意识到这是因为我命名了(缩写)构造函数,而不是完整的类型,因此我研究了文档并将成员的类型更改为:
Eigen::SimplicialLDLT<Eigen::SparseMatrix<double>, Eigen::Lower, Eigen::AMDOrdering<int>> cached_solver;
这确实是编译的,但前提是我评论(更新的)构造函数。如果我将构造函数留在一个错误中,我会告诉我我正在尝试"使用已删除的函数",并且它被"隐式删除",因为默认定义将是错误的。我认为正在发生的事情是,必须发生一个隐性副本,其中包括对构造函数的调用,因此我添加了一个'&amp;对此:
MatrixCachePerObjectData(Eigen::SimplicialLDLT<Eigen::SparseMatrix<double>, Eigen::Lower, Eigen::AMDOrdering<int>>& cs, Eigen::SparseMatrix<double> cm, bool cv) : cached_solver(cs), Q_T(cm), cache_valid(true) {}
但这给了我同样的错误,我不太确定为什么。我最好的(但仍然很糟糕的)猜测是,它没有打电话给copy
-函数,而是称其为同等的move
功能,但说实话,我真的在这里确实毫无头绪。因此,我放弃了构造函数,并试图直接访问成员:
auto mpc = new MatrixCachePerObjectData();
mpc->cached_solver = sparseSolver;
这可以预见,这再次失败,同样的错误。我尝试打印出类型,以查看我是否在那里犯了一个错误并遇到:
N5Eigen14SimplicialLDLTINS_12SparseMatrixIdLi0EiEELi1ENS_11AMDOrderingIiEEEE // typeid(sparseSolver).name()
这让我更加困惑。任何帮助都将不胜感激。
将eigen3求解器作为类成员缓存的正确方法是什么?
这是我上面建议的第二种方法,是一个工作的独立示例:
#include <Eigen/Sparse>
using namespace Eigen;
class Cache {
typedef SimplicialLDLT<SparseMatrix<double> > Solver;
Solver m_solver;
public:
Solver& solver() { return m_solver; }
};
int main()
{
Cache cache;
auto& solver = cache.solver();
SparseMatrix<double> A = MatrixXd::Random(10,10).sparseView();
A = A.transpose() * A;
solver.compute(A);
}
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 嵌套在类中时无法设置成员数据
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将函数类成员映射到类本身内部
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 线程中静态成员的缓存效率
- 我如何将本特征求解器作为班级成员缓存
- C++成员函数结果缓存实现
- 提振.Python缓存包装类成员