我正在尝试使用以下公式为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)得到负指数;我应该如何处理这些情况,因为矩阵指数只是正数?
答案 0 :(得分:0)
通常,当模数(%)操作需要处理负索引时,您可以根据需要简单地添加模数参数。由于
x % N == ( x + a*N ) % N
对于所有自然a,并且在这种情况下你有i和j约束在[0,N],那么你可以写(N + i - j)并确保即使我是0和j是N-1(或者甚至是N),结果总是非负的。出于同样的原因,(2 * N + i - 2 * j)或等效(i + 2 *(N-j))总是非负的。
但在这种情况下,这不是必需的。要反转地图,您将重复前进步骤撤消分配。由于矩阵具有一元行列式并且是面积保持的,因此您可以确保最终获得所有积分(即覆盖M(i + 1)将产生M(i)的覆盖)。 / p>
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应该完全相同。
(实际上,您已经将反向转换作为前向转换了。我设置的转换为你的转换是一种常用的形式。正向转型)。