使用模板化特征矩阵

时间:2015-08-17 11:07:56

标签: c++ eigen3

我写了一个像

这样的课程
class abc
{
public:
    template <typename Derived >
    abc( const Eigen::MatrixBase < Derived > &matA,
         const Eigen::MatrixBase < Derived > &matB,
         Eigen::MatrixBase < Derived > &matC );
};

template <typename Derived >
abc::abc( const Eigen::MatrixBase < Derived > &matA,
          const Eigen::MatrixBase < Derived > &matB,
          Eigen::MatrixBase < Derived > &matC )
{
    matC.derived().resize( matA.rows(), matA.cols() );

    for( int r = 0; r < matA.rows(); r++ )
    {
        for( int c = 0; c < matA.cols(); c++ )
        {
            matC(r,c) = log( matA(r,c) )/log( matB(r,c) );
        }
    }
}

但在main中使用类abc时 我得到未定义的引用错误

typedef Eigen::Matrix< float, Eigen::Dynamic, Eigen::Dynamic > Matrix_Float;
main()
{
Matrix_Float matA, matB, matC;
// put values in matA, matB
    abc cls_abc( matA, matB, matC );
}

错误是 错误:未定义引用`abc :: abc&lt; Eigen :: Matrix&lt; float,-1,-1,0,-1,-1&gt; &GT; (Eigen :: MatrixBase&lt; Eigen :: Matrix&lt; float,-1,-1,0,-1,-1&gt;&gt; const&amp;,Eigen :: MatrixBase&lt; Eigen :: Matrix&lt; float,-1 ,-1,0,-1,-1&gt;&gt; const&amp;,Eigen :: MatrixBase&lt; Eigen :: Matrix&lt; float,-1,-1,0,-1,-1&gt;&gt;&amp;) &#39;

类定义的语法有什么问题吗?

请帮忙。

1 个答案:

答案 0 :(得分:0)

你有一些问题。首先,对于模板类,您需要使用声明提供实现(即在.h文件中,而不是.cpp)。其次,您希望该类是模板化的,请注意构造函数。第三,使用模板化类时,需要指定模板参数。

将所有这些组合在一起,您的类(.h)文件应如下所示:

template <typename Derived > class abc  // Template the class
{
public:
    //template <class Derived > // Don't put this here, but above
    abc(
        const Eigen::MatrixBase < Derived > &matA,
        const Eigen::MatrixBase < Derived > &matB,
        Eigen::MatrixBase < Derived > &matC);
};

template <typename Derived >
abc<Derived>::abc(
    const Eigen::MatrixBase < Derived > &matA,
    const Eigen::MatrixBase < Derived > &matB,
    Eigen::MatrixBase < Derived > &matC)
{
    matC.derived().resize(matA.rows(), matA.cols());

    for (int r = 0; r < matA.rows(); r++)
    {
        for (int c = 0; c < matA.cols(); c++)
        {
            matC(r, c) = log(matA(r, c)) / log(matB(r, c));
        }
    }
}

并且您的main()应如下所示:

int main(int argc, char* argv[]) // just "main()" is so passé
{
    Matrix_Float matA, matB, matC;
    // put values in matA, matB
    abc<Matrix_Float> cls_abc(matA, matB, matC);
}