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++功能(例如,移動語義),還有其他更有效/更有效的可能性嗎?
非常感謝您的幫助。