2016-06-21 47 views
3

我想了解低於該調換的行X山坳移調矩陣:如何這段代碼換位矩陣

int transpose(int* a, int row, int col) 
{ 
    for(int i = 0; i < row*col; i++) 
    { 
     int old = i; 
     do 
     { 
      old = (old%row)*col + old/row; 
     } 
     while(old < i) 
     swap(a[i],a[old]) 
    } 
} 

什麼這行(old = (old%row)*col + old/row)是做矩陣碼?

+0

顯然,外層循環遍歷矩陣的所有元素。但是,並不是每個元素都要與其合作伙伴交換。我覺得這有點難以理解。我覺得有點奇怪,很明顯,'old'的值不會隨着while循環迭代而改變。 – Codor

+1

它在排列週期之後。看到這裏:https://en.wikipedia.org/wiki/In-place_matrix_transposition – samgak

+0

第一個和最後一個元素將保持在他們的位置..其他元素將被交換。到目前爲止,我所理解的是每個元素a [i]我們試圖找到它的舊位置並與之交換 – Bhuwan

回答

0

該矩陣存儲在大小爲row*col的一維數組中。數組索引是i=r*col+c,假設c是當前行,r是當前行。要計算索引中的行,請使用整數除法r=i/col來獲取列索引,使用餘數c=i%col

在引用的行中,old是數組索引。該聲明計算轉置元素的新索引,因爲如上所示,除法和餘數不是用col來計算,而是用row來計算。

do while循環防止元素被交換兩次。但是我覺得很難理解,並且認爲應該有更好的方法來做到這一點。

+0

更好(更清晰,可能更快)的方式存在,但需要一些內存來存儲已交換的元素索引。 https://en.wikipedia.org/wiki/In-place_matrix_transposition – MBo