2014-12-06 70 views
1

我tryining過載操作者〜那轉置一個給定的矩陣:過載操作者以調換陣列

這是我的代碼:

virtual B operator~()const 
{ 
    B a(column,row); 
    for (int i = 0; i<row; i++) 
    { 
     for (int j = 0; j<column; j++) 
     { 
      a.e[i] = e[j]; 
     } 
    } 
    return a; 
} 

e是指向存儲器中存儲乙

的所有整數元素
int *const e; 

但是在輸出中,我得到了一個由零填充並具有相同大小的矩陣。我的意思是如果我沒有轉置5x2,我得到了與零填充相同的5x2。

編輯: 我constuctor:

B(int r, int c) 
    : row(r), column(c), e(new int[r*c]) 
{ 
    for (int i = 0; i < r*c; i++) 
    { 
     e[i] = 0; 
    } 
} 
+0

您需要提供更多關於您的類「B」的信息:它的構造函數B(int,int)的作用是什麼,以及它如何將矩陣的元素存儲在平坦的一維數組中。 – dasblinkenlight 2014-12-06 12:30:51

+1

很確定這裏需要一些行列數學。 – WhozCraig 2014-12-06 12:30:51

+0

我編輯了我的帖子。 – Cieja 2014-12-06 12:32:25

回答

1

代碼未填寫a.e正確:而不是轉置矩陣,它使覆蓋對應於同一行鍼對不同的列數的區域。

假設行主順序,代碼應該是這樣的:

for (int i = 0; i<row; i++) 
{ 
    for (int j = 0; j<column; j++) 
    { 
     a.e[j*row+i] = e[i*column+j]; 
    } 
} 

既然你提到,你有充滿了零的結果,你的拷貝構造函數和/或賦值運算符的邏輯可能無法正確編碼。請注意,由於B::e是動態分配的,因此you need a destructor as well

+0

'e [i * row + j]'可能會索引超出邊界,我假設你的意思是'e [i * column + j]'(對於'ae [j * column + i]'是'ae [j * row + i]') – SleuthEye 2014-12-06 12:51:11

+0

@SleuthEye你是對的,我混淆了這兩個指標。謝謝! – dasblinkenlight 2014-12-06 12:57:11

0
B a(column,row); 
for (int i = 0; i<row; i++) 
{ 
    for (int j = 0; j<column; j++) 
    { 
     a.e[i] = e[j]; 
    } 
} 

未訪問大部分元素在任何這個一個。只有元件至和至分別被訪問。

歸零構造函數不顯示怎麼行/列存儲,但猜測是

int& B::at(int r, int c){ 
    return e[r*column + c]; 
} 

另一種方法是

return e[c*row + r]; 

在這種情況下,你可以通過

virtual B operator~()const 
{ 
    B a(column,row); 
    for (int i = 0; i<row; i++) 
    { 
     for (int j = 0; j<column; j++) 
     { 
      a.at(i, j) = at(j, i); // swap row, column 
     } 
    } 
    return a; 
} 
0

首先,您似乎總是在轉置中設置第一個[0..row]元素,其中原稿中每一行的最後一個元素,然後停在那裏。

其次,我不知道B是如何在內部鋪設的,但是因爲你可以指定矩陣的大小,我推斷用於存儲元素的內部數組是動態分配在一維緩衝區中。這意味着您有一個複製構造函數以避免在方法結束時刪除a時出現問題。你得到很多0可能意味着(除了你不掃描整個矩陣的事實),你的拷貝構造函數沒有正確實現。

編輯看到您編輯的問題,我傾向於確定複製構造函數是問題。您沒有崩潰,因爲5x2 = 2x5元素(所以內部緩衝區大小相同)。