我自己开发了一个基于表达式模板的 C++ 矩阵类。我重载了()
运算符,以便我可以读取或写入元素矩阵,例如,
cout << A(i,j) << endl;
和
A(i,j)=b;
分别。我还实现了一个Range
类来启用类似 Matlab 的读取
cout << A(Range(3,5),Range(0,10)) << endl;
模板Matrix
类示例为
template <typename OutType>
class Matrix
{
private:
int Rows_; //number of Rows
int Columns_; //number of Columns
OutType *data_; //row-major order allocation
public:
// --- Access operators
inline OutType & operator()(const int i, const int j) { return data_[IDX2R(i,j,GetColumns())]; }
inline OutType operator()(const int i, const int j) const { return data_[IDX2R(i,j,GetColumns())]; }
// --- SubExpressions - Range Range
inline Expr<SubMatrixExpr<const OutType*,OutType>,OutType> operator()(Range range1, Range range2)
{ typedef SubMatrixExpr<const OutType*,OutType> SExpr;
return Expr<SExpr,OutType>(SExpr(data_,Rows_,Columns_,range1.numelements_,range2.numelements_,range1.start_,range1.step_,range2.start_,range2.step_),
range1.numelements_,range2.numelements_);
}
}
我现在想启用类似 Matlab 的作业
A(Range(3,5),Range(0,10))=B;
其中B
是一个合适的矩阵。
我认为,要实现上面类似 Matlab 的语法,有两种可能性是
- 重载
()
运算符,使其返回一个指针数组,然后重载=
运算符,以便后者可以在指针数组和 a 之间进行Matrix
操作 - 利用上面指出的已经执行的
()
运算符重载并重载运=
算符,以便后者可以在表达式和Matrix
.
也许第一个选项不是很方便,特别是对于非常大的矩阵。我对么?是否有其他更有效/更有效的可能性使用可能更复杂的 C++ 功能(例如,移动语义)?
非常感谢您的帮助。