Mar*_*dik 17 c++ templates encapsulation expression-templates eigen
我想在我的程序中使用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;
}
Run Code Online (Sandbox Code Playgroud)
由于Eigen使用表达式模板,代码如
u = 2*v + w + 0.2*z;
Run Code Online (Sandbox Code Playgroud)
在上面提到的样品中,减少到长度为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_;
}
Run Code Online (Sandbox Code Playgroud)
那么表达式就像:
UsingEigen a, b, c, d;
a = b + c + d;
Run Code Online (Sandbox Code Playgroud)
无法利用Eigen的实施方式.这不是最后一个.还有许多其他示例,其中表达模板用于Eigen.
简单的解决方案不是自己定义运算符,data_公开并只写下以下表达式:
UsingEigen a, b, c, d;
a.data_ = b.data_ + c.data_ + d.data_;
Run Code Online (Sandbox Code Playgroud)
这打破了封装,但它保留了Eigen的效率.
其他方法可能是创建自己的运算符,但让它们返回表达式模板.但由于我是C++的初学者,我不知道这是否是正确的方法.
如果这个问题过于笼统,我很抱歉.我是初学者,没有人问.到目前为止,我std::vector<float>到处都在使用,但现在我也需要使用矩阵.std::vector<float>在我的整个项目中切换到Eigen是一个很大的进步,我害怕在一开始就拨打错误的电话.欢迎任何建议!
为什么暴露data_破解封装?封装意味着隐藏实现细节并仅暴露接口.如果您的包装类UsingEigen没有向本机Eigen库添加任何行为或状态,则接口不会更改.在这种情况下,您应该完全删除此包装并使用Eigen数据结构编写程序.
暴露矩阵或向量不会破坏封装:只暴露矩阵或向量的实现就可以做到这一点.该Eigen库公开算术运算符,但不公开它们的实现.
使用表达式模板库,用户扩展库功能的最常用方法是添加行为,而不是通过添加状态添加.对于添加行为,您不需要编写包装类:您还可以添加根据Eigen类成员函数实现的非成员函数.请参阅Scott Meyers 撰写的 "非成员函数如何改进封装"一栏.
至于您担心将当前程序转换为明确使用该Eigen功能的版本:您可以逐步执行更改,每次更改程序的小部分,确保您的单元测试(您确实有单元)测试,不是吗?)随着你的进展不要打破.