2013-05-09 3 views
1

나는 내 자신의 표현식 템플릿 기반 C++ 행렬 클래스를 개발했습니다. I 읽거나 예로서 소자 매트릭스를 작성할 수 있도록 I 각각A (:, k) = b를 구현하는 것; C++ 매트릭스 라이브러리의 Matlab과 유사한 구문

cout << A(i,j) << endl; 

A(i,j)=b; 

() 연산자 과부하있다. 는 또한 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_); 
     } 
} 

로 예시

cout << A(Range(3,5),Range(0,10)) << endl; 

템플릿

로 지금

로 matlab에 같은 할당을 사용 하시겠습니까 matlab에 같은 읽기를 가능하게하는 Range 클래스를 구현
A(Range(3,5),Range(0,10))=B; 

여기에서 B은 적절한 매트릭스입니다.

는 I는 두 가지 가능성이

  1. 그것이 포인터 배열을 반환되도록 () 연산자 과부하하고되도록 = 연산자 과부하 될 상기 Matlab의 유사한 구문을 달성 할 것으로 생각 후자는 포인터 배열과 Matrix 사이에서 작용할 수 있습니다.
  2. 은 위에 표시된 () 연산자의 오버로드를 이용하고 = 연산자를 오버로드하여 표현식과 Matrix 사이에서 작용할 수 있습니다.

아마도 매우 큰 매트릭스의 경우 첫 번째 옵션이 매우 편리하지 않을 수 있습니다. 맞습니까? 더 정교한 C++ 기능 (예 : 의미 이동)을 사용하여보다 효율적이고 효과적인 다른 가능성이 있습니까?

도움 주셔서 감사합니다.

답변

1

operator()(Range, Range)의 non-const 버전을 사용하면 범위에 할당하는 방법을 알고있는 오버로드 된 할당 연산자가있는 프록시 개체를 반환하는 것이 가장 좋은 방법이라고 생각합니다. 예를 들어 원래의 행렬로 되돌립니다.