2012-11-01 82 views
3

在類矩陣C++,重新定義操作符=,分配一個子矩陣的矩陣

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; 

感謝您的幫助。

+0

矩陣的維數是否寫入變化? –

+0

@ Tom:賦值之前和之後的A矩陣的維數不會改變... – justik

+3

您必須創建一個Submatrix類,爲該類定義'operator =()'(重載),並使'Matrix :: operator()(int,int,int,int)'返回一個子矩陣。子矩陣只是矩陣的一個小代理,它保留了對矩陣和邊界的引用。所有操作都被轉發到主矩陣。 –

回答

0

我會認爲簡單的解決辦法是保持同樣的類型,以及剛剛創建,創建一個較小的子矩陣(仍然Matrix型),拷貝值,並通過值返回它的方法。

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

然後,您的添加,賦值等操作在嘗試翻譯某種其他類型時沒有額外開銷。

你會支付Matrix副本的開銷,但我不會在你的生活中的這一點上強調這一點。 :)