2012-03-30 113 views
1

我想轉置一個C矩陣,儘可能少的內存使用。因此,不能簡單地創建矩陣的副本,填寫它,然後刪除另一個。因此,我希望在矩陣本身上進行每次交換,並重新使用1個臨時變量。矩陣元素使用指針算術進行索引,但據我所知,這些都是正確的。現在的問題是該功能不會導致任何更改。矩陣結構是動態分配的,具有以下結構;動態分配的二維矩陣轉置(內存有效)

typedef struct { 
int rows; 
int cols; 
int** data; 
    } matrix; 

我現在寫的轉置函數看起來如下;

void transpose(matrix* m){ 
int i,j,temp; 
for(i=0;i<m->row;i++){ 
    for(j=0;j<m->col;j++){ 
     temp=*((*(m->data+i))+j); 
     *((*(m->data+i))+j)=*((*(m->data+j))+i); 
     *((*(m->data+j))+i)=temp; 
    } 
} 

}

我已經嘗試過用

int* temp=(int*)malloc()sizeof(int); 

啓動功能,並與

free(temp); 

這給了我在Visual Studio約ADRES接取一個錯誤的結局。有小費嗎?

+0

如果是正方形(rows == cols),則只能像這樣在原地進行轉置。如果不是正方形,那麼就有方法,但它們要複雜得多。 – 2012-03-30 13:56:49

+0

[使用1D數組的原地矩陣轉置]可能的重複(http://stackoverflow.com/questions/9902767/in-place-matrix-transposition-using-a-1d-array) – 2012-03-30 13:57:44

回答

2

你正在索引整個矩陣在你的for循環(我假設你的矩陣是正方形的)......你只需要索引矩陣的下三角或上三角,然後交換那些在矩陣的相反三角形中具有相應指標的位置。要轉置矩陣的對角線,只需將對角線的上半部分與下半部分交換即可。通過對整個矩陣進行索引,您最終將執行雙重轉置,最終返回與原始矩陣完全相同的結果。

+0

確實,愚蠢的算法錯誤我的。謝謝,如果你現在看它,那是一個明顯的錯誤,但它讓我頭疼:p – Mathieu 2012-03-30 14:15:14