Я разработал собственный матричный класс 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, есть две возможности:
()
оператор, так что он возвращает массив указателей, а затем перегружает =
оператор, чтобы последний мог действовать между массивом указателей и Matrix
;()
оператор указан выше и перегружает =
оператор, чтобы последний мог действовать между выражением и Matrix
,Возможно, первый вариант не очень удобен, особенно для очень больших матриц.
Я прав? Существуют ли другие более эффективные / действенные возможности, использующие, возможно, более сложные функции C ++ (например, семантика перемещения)?
Большое спасибо за Вашу помощь.
Я думаю, что вам лучше всего иметь неконстантную версию operator()(Range, Range)
вернуть прокси-объект с перегруженным оператором присваивания, который знает, как присваивать диапазон (например, обратно в исходную матрицу).
Других решений пока нет …