1
我开发了一个基于表达式模板的C++矩阵类。我已分别重载()
操作者,这样我可以读或写元件矩阵作为,例如,实现A(:,k)= b; C++矩阵库中的Matlab-like语法
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的语法类似,两种可能性将是
- 重载
()
操作者,所以它返回一个指针数组,然后重载=
操作员,使得后者可以在指针阵列和Matrix
之间起作用; - 利用已经执行的上述
()
运算符的超载和超载=
算子,使得后者可以在表达式和Matrix
之间起作用。
也许第一个选项不是很方便,特别是对于非常大的矩阵。 我正确吗?使用更复杂的C++功能(例如,移动语义),还有其他更有效/更有效的可能性吗?
非常感谢您的帮助。