2013-05-09 114 views
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的语法类似,两种可能性将是

  1. 重载()操作者,所以它返回一个指针数组,然后重载=操作员,使得后者可以在指针阵列和Matrix之间起作用;
  2. 利用已经执行的上述()运算符的超载和超载=算子,使得后者可以在表达式和Matrix之间起作用。

也许第一个选项不是很方便,特别是对于非常大的矩阵。 我正确吗?使用更复杂的C++功能(例如,移动语义),还有其他更有效/更有效的可能性吗?

非常感谢您的帮助。

回答

1

我认为你最好的选择是让operator()(Range, Range)的非const版本返回一个代理对象,该代理对象具有知道如何分配给范围的重载赋值运算符(例如回到原始矩阵)。