[英]Polymorphic wrapper around matrix/linear algebra libraries - C++, starting with Eigen
我正在编写一个严重依赖线性代数例程的自定义C ++数值库。 我还使用Eigen来满足实际的矩阵运算。 我想将我的库与Eigen实现解耦,以便它不了解Eigen。 这将使我能够将Eigen引用保留在一个位置,并可以在不久的将来轻松将线性代数库更改为另一种实现。
在Java中,这将相对简单。 但是,由于Eigen使用模板,因此我遇到了困难。 特别是我正在使用MatrixXd和VectorXd类型。 有没有人建议围绕这些类构造包装器,以在Eigen和我的图书馆之间提供牢固的界限?
我的第一次尝试是使用组合实现的,因此对MyBaseMatrix的调用被定向为包含类型(例如MatrixXd)的调用,如下所示: https ://forum.kde.org/viewtopic.php?f=74&t=87072&p=154014&hilit = wrap + eigen#p154014 。 但是我是否会保留Eigen的后台优化功能表示怀疑?
这里提出了另外两个解决方案: http ://eigen.tuxfamily.org/dox-devel/TopicCustomizingEigen.html#ExtendingMatrixBase(扩展MatrixBase或继承Matrix)。 但是,它们似乎不允许我在特征类型和数值库之间建立严格的界限。 扩展MatrixBase似乎也不允许运算符重载吗?
我曾考虑继承Matrix和MyBaseMatrix(多重继承),但是在尝试保留清晰的边界时,模板使我头疼。
是否有人对这个特定问题有任何经验,或者对C ++中的类似问题有解决方案?
从代码设计的角度来看,我不建议这样做,因为您不太可能会替换线性代数库。 因此,封装它很可能不会带来任何好处,并使您的代码更加复杂。 但是,如果您确实要执行此操作,则可以使用模板专门化。 遵循以下内容:
template< typename InternalMatrixType>
class Matrix
{
private:
InternalMatrixType _matrix;
public:
// Example function
float operator[](unsigned index)
{
return _matrix[index];
}
};
对于特定的线性代数库:
template<>
class Matrix<EigenMatrixType>
{
private:
EigenMatrixType _matrix;
public:
// Example function
float operator[](unsigned index)
{
return _matrix.get(index);
}
};
编辑:添加了有关typedef的信息以阐明用法。 根据穆德勒的以下评论。
然后,您可以在整个库中键入定义模板类的定义。 这将允许您使用cMatrix
vs Matrix<InternalMatrixType>
。
typedef Matrix<InternalMatrixType> cMatrix;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.