繁体   English   中英

围绕矩阵/线性代数库的多态包装器-C ++,从本征开始

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM