Я использую эту функцию для сдвига элементов матрицы.
Для этого я переключаюсь между 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;
Таким образом, в нечетной матрице средняя строка и столбец будут игнорироваться, а не последняя строка и столбец.
Обновить
Сказав это, ваши циклы будут в этом случае зайти слишком далеко, поэтому вам все равно придется использовать исходные строки / 2 и столбцы / 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;
}
}
}
Других решений пока нет …