шаблонное метапрограммирование — реализация A (:, k) = b; Matlab-подобный синтаксис в матричной библиотеке C ++

Я разработал собственный матричный класс 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, есть две возможности:

  1. перегрузка () оператор, так что он возвращает массив указателей, а затем перегружает = оператор, чтобы последний мог действовать между массивом указателей и Matrix;
  2. использовать уже выполненную перегрузку () оператор указан выше и перегружает = оператор, чтобы последний мог действовать между выражением и Matrix,

Возможно, первый вариант не очень удобен, особенно для очень больших матриц.
Я прав? Существуют ли другие более эффективные / действенные возможности, использующие, возможно, более сложные функции C ++ (например, семантика перемещения)?

Большое спасибо за Вашу помощь.

1

Решение

Я думаю, что вам лучше всего иметь неконстантную версию operator()(Range, Range) вернуть прокси-объект с перегруженным оператором присваивания, который знает, как присваивать диапазон (например, обратно в исходную матрицу).

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector