2013-05-09 112 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版本返回一個代理對象,該代理對象具有知道如何分配給範圍的重載賦值運算符(例如回到原始矩陣)。