C++ 移动矩阵

C++ 移动矩阵,c++,shift,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++){

我用这个函数来移动矩阵的元素。 为此,我在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;
        }
    }
}
void ftshift(双**过滤器、整数行、整数列){
int r2、c2、tmp1_3、tmp2_4;
r2=行/2;
c2=cols/2;

对于(int i=0;i假设我已经理解了您要做的事情,我认为您需要更改这些行:

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++){

for(int i=0;i对于一个3 x 3矩阵,什么是所需的输出:
{[1 2 3],[4 5 6],[7 8 9]}
其中每一行都在
[…]
?如果你希望得到帮助,你应该愿意写出9个简单的数字,即3x3矩阵的预期输出,而不仅仅是发布一个链接。但是如果你愿意稍微锻炼一下你的头脑,你就不会在这里提出一个琐碎的问题。祝你好运。很抱歉,我要做的是获得这个问题我写的是:{[9 2 7],[4 5 6],[3 8 1]}干得好!我认为下面的答案是正确的,可以满足你的要求:)它工作得很好,谢谢。我不知道我是否可以为你投票
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;
        }
    }
}