1

我自己开发了一个基于表达式模板的 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. 重载()运算符,使其返回一个指针数组,然后重载=运算符,以便后者可以在指针数组和 a 之间进行Matrix操作
  2. 利用上面指出的已经执行的()运算符重载并重载运=算符,以便后者可以在表达式和Matrix.

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

非常感谢您的帮助。

4

1 回答 1

1

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

于 2013-05-09T13:21:37.127 回答