2013-05-29 64 views
-1

我正在使用這個函數來移動矩陣的元素。 要做到這一點,我正在轉移1-3象限和2-4。 它適用於N的偶數值,但對於奇數N,它不適用於最後一個元素。 我需要因爲我有傅立葉變換後用就用這種轉變變換移動矩陣

void ftshifting(double **filter,int rows,int cols){ 
    int r2,c2,tmp1_3,tmp2_4; 
    r2 = rows/2; 
    c2 = cols/2; 
    for (int i = 0; i<r2; i++){ 
     for (int k = 0; k<c2; k++){ 
      tmp1_3 = filter[i][k]; 
      filter[i][k] = filter[i+r2][k+c2]; 
      filter[i+r2][k+c2] = tmp1_3; 
      tmp2_4 = filter[i+r2][k]; 
      filter[i+r2][k] = filter[i][k+c2]; 
      filter[i][k+c2] = tmp2_4; 
     } 
    } 
} 
+0

什麼是所期望的輸出是3×3矩陣:'{[1 2 3],[4 5 6],[7 8 9]}'每行都在'[...]'中? – necromancer

+0

http://www.mathworks.es/es/help/matlab/ref/fftshift.html – Elvio

+0

如果你期望幫助,你應該願意寫出9個簡單的數字,即我。即3x3矩陣的預期輸出,而不僅僅是發佈鏈接。但如果你願意稍微鍛鍊一下自己的想法,那麼無論如何你都不會在這裏遇到一個微不足道的問題。祝你好運喂勺。 – necromancer

回答

1

假設我明白你想要做什麼,我認爲你需要改變這些行:

r2 = rows/2; 
c2 = cols/2; 

這樣:

r2 = (rows+1)/2; 
c2 = (cols+1)/2; 

所以在奇數矩陣,中間行和列將被忽略,而不是過去的行和列。

更新

說了這麼多,你的循環屆時將要在奇數的情況下太遠,所以你仍然需要使用原始行/ 2和cols/2的循環範圍。

for (int i = 0; i<rows/2; i++){ 
    for (int k = 0; k<cols/2; k++){ 

作爲參考,這裏的整體功能是什麼樣子的更新:

void ftshifting(double **filter,int rows,int cols){ 
    int r2,c2,tmp1_3,tmp2_4; 
    r2 = (rows+1)/2; 
    c2 = (cols+1)/2; 
    for (int i = 0; i<rows/2; i++){ 
     for (int k = 0; k<cols/2; k++){ 
      tmp1_3 = filter[i][k]; 
      filter[i][k] = filter[i+r2][k+c2]; 
      filter[i+r2][k+c2] = tmp1_3; 
      tmp2_4 = filter[i+r2][k]; 
      filter[i+r2][k] = filter[i][k+c2]; 
      filter[i][k+c2] = tmp2_4; 
     } 
    } 
} 
+0

它完美的作品表示感謝。我不知道我是否可以爲你投票 – Elvio