0

我想扩展一个 eigen3 类型如下:

typedef Eigen::Matrix<unsigned char, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> CMatrixImgParent;

class CMatrixImg : public  CMatrixImgParent
{
  public:
    CMatrixImg() : CMatrixImgParent() {}

    int Dummy(const char *filename) const {};
};

然后用eigen3做一些算术。

CMatrixImg img1, img2, imgSum;
imgSum = img1 + img2;

但这不起作用,因为我使用 g++ 得到错误:

g++ -o bug.o -c -O2 -I/usr/include/eigen3 bug.cc
bug.cc: In function 'int main(int, char**)':
bug.cc:17:10: error: no match for 'operator=' (operand types are 'CMatrixImg' and 'const Eigen::CwiseBinaryOp<Eigen::internal::scalar_sum_op<unsigned char>, const Eigen::Matrix<unsigned char, -1, -1, 1>, const Eigen::Matrix<unsigned char, -1, -1, 1> >')
   imgSum = img1 + img2;
          ^
bug.cc:17:10: note: candidate is:
bug.cc:5:7: note: CMatrixImg& CMatrixImg::operator=(const CMatrixImg&)
 class CMatrixImg : public  CMatrixImgParent
       ^
bug.cc:5:7: note:   no known conversion for argument 1 from 'const Eigen::CwiseBinaryOp<Eigen::internal::scalar_sum_op<unsigned char>, const Eigen::Matrix<unsigned char, -1, -1, 1>, const Eigen::Matrix<unsigned char, -1, -1, 1> >' to 'const CMatrixImg&'
scons: *** [bug.o] Error 1
scons: building terminated because of errors.

Compilation exited abnormally with code 2 at Tue Jul 16 18:31:18

当然,我可以通过像这样的一些显式转换来解决这个问题:

(*(CMatrixImgParent*)&imgSum) = img1 + img2;

但这非常难看。

我可以在类定义中放置任何简单的代码来解决对这种类型转换的需求吗?

4

2 回答 2

1

Eigen的文档建议继承自Eigen::Matrix(本质上CMatrixImgParent在您的示例中)应该只是最后的手段,并且允许您Eigen::Matrix直接添加成员的宏驱动方法是首选:

在从 Matrix 继承之前,说真的,我的意思是真的确定使用 EIGEN_MATRIX_PLUGIN 不是你真正想要的(参见上一节)。如果您只需要向 Matrix 添加少量成员,这就是要走的路。

宏观方法描述为:

在本节中,我们将看到如何向 MatrixBase 添加自定义方法。由于所有表达式和矩阵类型都继承了 MatrixBase,因此向 MatrixBase 添加方法使其立即可用于所有表达式!例如,一个典型的用例是使 Eigen 与另一个 API 兼容。

您当然知道在 C++ 中不可能向现有类添加方法。那怎么可能呢?这里的技巧是在 MatrixBase 的声明中包含一个由预处理器标记 EIGEN_MATRIXBASE_PLUGIN 定义的文件

他们给出的例子是

class MatrixBase {
// methods ...
#ifdef EIGEN_MATRIXBASE_PLUGIN
#include EIGEN_MATRIXBASE_PLUGIN
#endif
};

因此,您似乎可以按照这种方法来定义您的int Dummy(const char* filename) const方法。如果您真的想继承 from Eigen::Matrix,您似乎需要自己编写一个赋值运算符,正如评论中提到的 nm 那样。

于 2013-07-16T16:23:52.473 回答
0

Adding an assignment operator from CMatrixImgParent to CMatrixImg class solves the casting problem:

class CMatrixImg : public  CMatrixImgParent
{
  public:
    // Constructor
    CMatrixImg() : CMatrixImgParent() {}

    // This is needed for assignment of arithmetic results.
    CMatrixImg& operator=(const CMatrixImgParent& Other) {
      *((CMatrixImgParent*)this) = Other;
      return *this;
    }
    int Dummy(const char *filename) const {};
};

But see also the answer by RyanMcK that might be preferable for eigen3.

于 2013-07-16T16:30:40.690 回答