2013-02-13 128 views
2

我正在編寫一個程序,用分配的內存轉置給定的矩陣。該函數對方矩陣NxN(rows == cols)起作用,但與MxN矩陣(行!= cols)碰撞。請幫助在C++中轉置矩陣

void transpose(int **matrix, int *row, int *col) 
{ 
    // dynamically allocate an array 
    int **result; 
    result = new int *[*col]; //creates a new array of pointers to int objects 
    // check for error 
    if (result == NULL) 
    { 
     cout << "Error allocating array"; 
     exit(1); 
    } 
    for (int count = 0; count < *col; count++) 
    { 
     *(result + count) = new int[*row]; 
    } 

    // transposing 
    for (int i = 0; i<*row; i++) 
    { 
     for (int j = i+1; j<*col; j++) 
     { 
     int temp = *(*(matrix + i) + j); 
     *(*(matrix + i) + j) = *(*(matrix + j) + i); 
     *(*(matrix + j) + i) = temp; 
     } 
    } 

    for (int i = 0; i<*row; i++) 
    { 
     for (int j = 0; j<*col; j++) 
     { 
      *(*(result + i) + j) = *(*(matrix + i) + j); 
      cout << *(*(result + i) + j) << "\t"; 
     } 
     cout << endl; 
    } 
} 
+0

'new'在失敗時會拋出異常。如果你希望它在失敗時返回'null',可以使用'new(nothrow)'(儘管這很奇怪)。 – 2013-02-13 08:08:05

回答

5

的線條:

for (int i = 0; i<*row; i++) 
{ 
    for (int j = i+1; j<*col; j++) 
    { 
    int temp = *(*(matrix + i) + j); 
    *(*(matrix + i) + j) = *(*(matrix + j) + i); 
    *(*(matrix + j) + i) = temp; 
    } 
} 

是問題。問題是矩陣是由我然後j索引的,而不是j然後我喜歡你在while循環中的第二行和第三行。圖像矩陣是一個2×3的矩陣,然後你嘗試執行矩陣[2] [3] =矩陣[3] [2],但矩陣[3] [2]不存在。

最好是去簡單地直接在此循環初始化結果:

for (int i = 0; i<*row; i++) 
    for (int j = 0; j<*col; j++) 
    result[j][i] = matrix[i][j]; 

然後你就可以像下面的輸出,或刪除矩陣和重新分配矩陣是導致如你所願。我的整個轉功能成爲了下面的代碼(ROW和COL不需要指針爲int傳值還是蠻好的同時訪問矩陣應該使用數組下標,因爲它是更好的方式。):

void transpose(int **matrix, int row, int col) 
{ 
    // dynamically allocate an array 
    int **result; 
    result = new int *[col]; //creates a new array of pointers to int objects 
    for (int i = 0; i < col; i++) 
    result[i] = new int[row]; 

    // transposing 
    for (int i = 0; i<row; i++) 
    for (int j = 0; j<col; j++) 
    result[j][i] = matrix[i][j]; 

    //output resulting matrix 
    for (int i = 0; i<col; i++) { 
    for (int j = 0; j<row; j++) 
    cout << result[i][j] << "\t"; 
    cout << endl; 
    } 
} 
+0

我試過了,但後來得到了一些醜陋的數字:( – Casper 2013-02-13 06:05:50

+0

是從你的輸出語句嗎?因爲你需要確保這些循環類似地索引結果,而不是* row by * col那些應該是* col由* row – pippin1289 2013-02-13 06:18:34

+0

我添加了我的整個轉置功能,我測試 – pippin1289 2013-02-13 06:35:21

1

您正在嘗試「就地」 轉置矩陣:

(基質+ I)+ J)= (基質+ J)+ I);

你不應該這樣做。如果列數大於分配給matrix的行數,則您將讀取和寫入未分配的內存。

恕我直言,將整個矩陣存儲在連續內存中會更好。不是在不同的部分。這樣的代碼是這樣的:

void transpose(int *matrix, int row, int col) 
{ 
    for (int i = 0; i < row; i++) 
    { 
     for (int j = i + 1; j < col; j++) 
     { 
      int temp = matrix[ i * col + j ]; 
      matrix[ i * col + j ] = matrix[ j * col + i ]; 
      matrix[ j * col + i ] = temp; 
     } 
    } 
} 

這種分配的只有零下,你不能解決的元素像matrix[ i ][ j ]但只有matrix[ i + col + j ]。加號是:1)容易分配/釋放內存(只是matrix = new int[ col * row ]delete [] matrix)2)更快地訪問元素(因爲它們的連續位置)

最後,我認爲,這將是最好的方式來看看std::vector。如果你願意,我可以告訴你,你將如何使用矢量功能看

+0

感謝您的輸入,我曾多次被告知,使用矢量是好得多,但對於這個問題我需要使用這個概念:( – Casper 2013-02-13 06:09:49