移动一个矩阵

Shifting a matrix

本文关键字:一个 移动      更新时间:2023-10-16

我使用这个函数来移动矩阵的元素。我在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;
        }
    }
}

假设我已经理解你想要做什么,我认为你需要改变这些行:

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;
        }
    }
}