将数据成员添加到特征矩阵类

时间:2017-08-21 13:43:02

标签: c++ eigen eigen3

我想将Eigen3用作简单实时音频处理库的后端引擎。关键的想法是通过一系列完全模板化的处理器传递Eigen-exressions,每个处理器返回一个修改的特征表达式。如果这些表达式可以携带时间戳或其他合理的元数据,那将非常有用。

例如,我希望能够执行以下操作:给定

Signal X(3, 1);
X << 1 , 0 , 0;
X.start_time = 0;

Signal Y(3, 1);
Y << 2 , 0 , 0;
Y.start_time = 2;

Signal Z(5, 1);
Z << 1, 0, 2, 0, 0;
Z.start_time = 0;

然后以下表达式shuold评估为true

(Z == X + Y).all();
(X+Y).start_time == 0;

我试图扩展Eigen :: Array类:我正在使用插件 如here所述,在ArrayBase类中添加数据成员,并且我已经使用documentation中描述的相应的constructore和赋值运算符定义了一个子类。设置/获取数据成员直接工作正常。 (见下面的例子)

但是,当我构造一个表达式并将其分配给另一个Signal时,不会复制该成员。这实际上很清楚,因为表达式的构造不涉及Signal构造函数,而是类层次结构中较高的一些构造函数。 据我所知,我无法在插件中实现自定义构造函数/赋值操作,因为它们已在相应的vanilla类中定义。

// ./eigen_extension.h

int my_member; // plugin to declare my_member in the eigen base class.


// main.cpp
#define EIGEN_DENSEBASE_PLUGIN "./eigen_extension.h"
#include <Eigen/Dense>


class Signal : public Eigen::ArrayXXf
{
    using Base = Eigen::ArrayXXf;

public:

    Signal(): Base()
    {
        this->my_member = 0;
    }

    template <typename OtherDerived>
    Signal(const Eigen::ArrayBase<OtherDerived>& other)
        : Base(other)
    {
        std::cout << "cpy ctor my_member: " << this->my_member << ", other: " << other.my_member << std::endl;
        this->my_member = other.my_member;
    }

    template <typename OtherDerived>
    EIGEN_DEVICE_FUNC
    EIGEN_STRONG_INLINE
    Signal& operator=(const Eigen::ArrayBase<OtherDerived>& other)
    {
        this->Base::operator=(other);
        std::cout << "cpy ass my_member: " << this->my_member << ", other: " << other.my_member << std::endl;
        this->my_member = other.my_member;

        return *this;
    }
};


int main(int argc, char* argv[])
{
    Signal X;
    X.my_member = 5;

    std::cout << X.my_member << std::endl; // prints 5

    auto Y = X * X;  // invokes copy ctor, prints cpy ctor my_member: -858993460, other: -858993460
    //Signal Y(X);

    std::cout << Y.my_member << std::endl; // prints -858993460, should print 5.
}

我还尝试了上述代码的一些变体,包括使用通用引用制作构造函数/ assignemnt运算符或将插件放置到特征类层次结构的不同级别。

我的问题是,是否以及如何使我的方案有效。

0 个答案:

没有答案