我想在我的程序中使用 Eigen 矩阵库作为线性代数引擎。Eigen 使用表达式模板来实现惰性求值并简化循环和计算。
例如:
#include<Eigen/Core>
int main()
{
int size = 40;
// VectorXf is a vector of floats, with dynamic size.
Eigen::VectorXf u(size), v(size), w(size), z(size);
u = 2*v + w + 0.2*z;
}
由于 Eigen 使用表达式模板,因此代码如
u = 2*v + w + 0.2*z;
在上面提到的示例中,减少到长度为 10 的单个循环(不是 40,浮点数按 4 块放入寄存器中)而不创建临时。多么酷啊?
但是如果我像这样集成库:
class UsingEigen
{
public:
UsingEigen(const Eigen::VectorXf& data):
data_(data)
{}
UsingEigen operator + (const UsingEigen& adee)const
{
return UsingEigen(data_ + adee.data_);
}
...
private:
Eigen::VectorXf data_;
}
然后像这样的表达式:
UsingEigen a, b, c, d;
a = b + c + d;
不能利用 Eigen 的实现方式。这不是最后一个。还有许多其他示例,在 Eigen 中使用了表达式模板。
简单的解决方案是不要自己定义运算符,data_
公开并编写如下表达式:
UsingEigen a, b, c, d;
a.data_ = b.data_ + c.data_ + d.data_;
这打破了封装,但它保留了 Eigen 的效率。
其他方式可能是制作我自己的运算符,但让它们返回表达式模板。但由于我是 C++ 的初学者,我不知道这是否是正确的方法。
如果这个问题本质上太笼统,我很抱歉。我是初学者,没有人问。到目前为止,我std::vector<float>
到处都在使用,但现在我也需要使用矩阵。在我的整个项目中切换std::vector<float>
到 Eigen 是一大步,我害怕一开始就打错电话。欢迎任何建议!