反转阿诺德的猫图 - 负数组索引

Invert Arnold's Cat map - negative array indexes

我正在尝试使用以下公式

为 N*N 张图像实施 Arnold's Cat map
            for (int i = 0; i < N; i++) {  
                for (int j = 0; j < N; j++) {  
                  desMatrix[(i + j) % N][(i + 2 * j) % N] = srcMatrix[i][j];  
                }  
            }

为了反转我做的过程:

            for (int i = 0; i < N; i++) {  
                for (int j = 0; j < N; j++) {  
                  srcMatrix[(j-i) % N][(2*i-j) % N] = destMatrix[i][j];  
                }  
            }

实现是否正确?

在我看来,对于 j 和 i 的某些值,我可能会从 (j-i) 和 (2*i-j) 得到负索引;我应该如何处理这些情况,因为矩阵索引只有正值?

一般来说,当模 (%) 运算需要对负索引起作用时,您只需根据需要多次添加模参数即可。自

x % N  == ( x + a*N ) % N

对于所有自然的 a,在这种情况下,您将 i 和 j 限制在 [0, N) 中,那么您可以编写 (N + i - j) 并确保即使 i 为 0 且 j 为 N -1(甚至 N),结果总是非负的。出于同样的原因,(2*N + i - 2*j) 或等效的 (i + 2*(N-j)) 总是非负的。

不过,在这种情况下,这不是必需的。要反转您的地图,您将重复向前的步骤 反转分配 。由于矩阵具有一元行列式并且是面积保留的,因此您确信最终会获得所有点(即覆盖 M(i+1) 将产生 M(i) 的覆盖)。

for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
        newMatrix[i][j] = desMatrix[(i + j) % N][(i + 2 * j) % N];
    }
}

此时 newMatrix 和 srcMatrix 应该是相同的。

(其实你已经运行把reverse转换成你的forward了。我设置的那个反转你的是正向转换的一种常用形式)。