3

クラスマトリックスで

typedef std::vector < std::vector <double> > TItems;
class Matrix
{
   private :
             TItems items;

   public:
           double & operator() ( int r, int c ) {return items[r][c];}
           Matrix & operator = (const Matrix A, short r1, short r2, short c1, short c2 )

}

演算子=を再定義して、行列に部分行列を割り当てられるようにしようとしています。

Matrix  & operator = (const Matrix &A, short r1, short r2, short c1, short c2)
{
  Matrix  A_sub( r2 - r1 + 1, c2 - c1 + 1 );

  for ( int i = 0; i < ( r2 - r1 + 1 ); i++ )
  {
    for ( unsigned int j = 0; j < ( c2 - c1 + 1); j++ )
        items[i][j] = A (r1 + i, c1 + j );
  }

  return *this;
 }

しかし、そのような定義は不可能です...そのようなタイプの表記法が必要な場合、どのように問題を修正するのですか?

Matrix A(8,8), B (3,9), C(3,4), D(2, 3), E (8, 8);, F(8,8)
...
A(1,3,2,5) = B (0,2,5,8) + C(0,2,0, 3) + D;
F = A + E;

ご協力いただきありがとうございます。

4

1 に答える 1

1

最も簡単な解決策は、同じ型を保持し、より小さな部分行列(まだ型のままMatrix)を作成し、値をコピーして値で返すメソッドを作成することだと思います。

class Matrix {
public:
  Matrix createSubMatrix(size_t ri, size_t ci, size_t rsz, size_t csz);
};

そうすれば、加算、割り当てなどの操作は、他のタイプの変換を試みる際に追加のオーバーヘッドを負わなくなります。

あなたはMatrixコピーのオーバーヘッドを支払うでしょう、しかし私はあなたの人生のこの時点でそれについて強調しません。:)

于 2012-11-01T19:10:39.053 に答える