【发布时间】:2020-03-11 06:35:12
【问题描述】:
我正在努力提高我的 C++ 技能——特别是模板的使用。我正在创建一个过滤数学库,它通过使用模板兼容不同的向量/矩阵类,包括 Boost 和 Eigen。到目前为止,我对该库非常满意,但在扩展功能时遇到了问题。
Eigen 和 Boost 的不同之处在于,后者没有乘法运算符(请参阅 1),因此这为我的实现提供了一个选择。我决定确保模板库中使用的矩阵/向量方法和运算符使用为 Eigen 定义的那些,以便至少有一个库可以很好地与数学库配合使用。在我的库中,我会使用 * 来乘以不能用于 boost 的矩阵。对于 boost,我为矩阵和向量创建了一个包装类,以允许通过自定义运算符使用 *。矩阵包装器示例如下:
class matrixBoost{
private:
boost::numeric::ublas::matrix<double> value;
public:
matrixBoost(){
}
matrixBoost(boost::numeric::ublas::matrix<double> value):value(value){}
static matrixBoost Identity(int dimension,int dimension2){
return matrixBoost(boost::numeric::ublas::identity_matrix<double>(dimension,dimension2));
}
matrixBoost transpose(){
matrixBoost t(boost::numeric::ublas::trans(value));
return t;
}
boost::numeric::ublas::matrix<double> getSystemValue() const{
return value;
}
};
//example operator - one of many
matrixBoost operator*(const matrixBoost &lhs, const matrixBoost &rhs){
matrixBoost res(boost::numeric::ublas::prod(lhs.getSystemValue(),rhs.getSystemValue()));
return res;
}
我现在正在尝试将 Eigen 的 block 添加到 boost 的包装类中,该类允许在 Eigen 的库中进行以下行为:
Eigen::MatrixXd m(2,2);m<<1,2,3,4;
Eigen::MatrixXd n = m.block(0, 0, 1, 2) + m.block(0,0,1,2);
m.block(0,0,1,2) = n;
现在与m 相等
2 4
3 4
我的第一个问题是有人可以链接或展示如何编码块函数的示例(甚至不考虑包装类)。我试过用谷歌搜索,但要么谷歌变得更糟,要么我没有使用正确的关键词——结果挤满了 operator[] 结果。我很难理解。我尝试在 Eigen 库源中搜索,并想象代码必须位于 here 但模板语言对我来说有点难以轻松解析。
我知道boost也有类似here所示的概念:
project(A, r1, r2) = C; // assign the submatrix of A specified by the two index ranges r1 and r2
C = project(A, r1, r2); // the submatrix of A specified by the two index ranges r1 and r2
我不确定是否可以向我的包装类添加块函数。现在我有以下内容:
matrixBoost block(int index1,int index2, int length1, int length2){
boost::numeric::ublas::range r1(i1,l1);
boost::numeric::ublas::range r2(i2,l2);
return matrixBoost(boost::numeric::ublas::project(value,r1,r2));
}
这适用于方法位于等号右侧的情况。但是,对于如何继续允许在左侧调用该方法,我遇到了困难。也许我应该利用boost的项目方法。任何帮助将非常感激!
谢谢。
【问题讨论】: