-1

我正在使用这个函数来移动矩阵的元素。为此,我在 1-3 象限和 2nd-4th 之间转换。它适用于 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;
        }
    }
}
4

1 回答 1

1

假设我已经了解您要做什么,我认为您需要更改以下几行:

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

对此:

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

所以在奇数矩阵中,中间的行和列将被忽略,而不是最后一行和列。

更新

话虽如此,在奇怪的情况下你的循环会走得太远,所以你仍然需要使用原始 rows/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;
        }
    }
}
于 2013-05-29T22:04:23.417 回答