反转阿诺德的猫图 - 负数组索引
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了。我设置的那个反转你的是正向转换的一种常用形式)。
我正在尝试使用以下公式
为 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了。我设置的那个反转你的是正向转换的一种常用形式)。