移动矩阵

时间:2013-05-29 21:30:18

标签: c++ shift

我正在使用此功能来移动矩阵的元素。 要做到这一点,我要在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;
        }
    }
}

1 个答案:

答案 0 :(得分: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;
        }
    }
}