猫脸映射中 数组引用传递的例子

来源:互联网 发布:数据库实例名是什么 编辑:程序博客网 时间:2024/05/21 17:06

    最近在做图像加密的程序设计,图像加密有一个比较有名的处理方法:猫脸映射。

    我在matlab中仿真实现了,然后将代码移植到java中,却发生了好些错误,这也让我加深了对猫脸映射的理解和对Java语言的理解。

   猫脸映射的解释:http://book.51cto.com/art/201403/434289.htm

    错误代码:

for (int k = 1; k <= arnoldChangeTimes; k++) {for (int i = 0; i < N; i++) {for (int j = 0; j < N; j++) {int X = (A11 * i + A12 * j) % N;int Y = (A21 * i + A22 * j) % N;afterArnold[X][Y] = beforeArnold[i][j];}}// 每轮置换beforeArnold = afterArnold;}
      这段代码的意思就是将原本在(i,j)处的值:将i,j处理得到x,y,然后将值放到了(x,y)处,当然这位置肯定不能是乱放的,而那个矩阵就可以使得这个映射过程是一一映射的。然后我们将第一次迭代之后产生的数组,再进行一次这样的迭代。

  这段代码为什么是错误的呢?就是因为最下面的一句   beforeArnold = afterArnold;这个在Java里面是引用传递。是什么意思呢?就是说如果 afterArnold数组的值改变了,那么beforeArnold 数组的值也会改变。但是我们需要它不变,它一旦变了,那么迭代产生的数组也就改变了,所以这里是不行的。

  那么怎么改变呢?很简单,在第一个for循环里面加一句: double[][] afterArnold = new double[N][N]; 这样就保证了每次的afterArnold数组都是新初始化的,而改变这个数组的值不会影响beforeArnold 数组。这样就达到了我们的目的。

   正确代码

for (int k = 1; k <= arnoldChangeTimes; k++) {double[][] afterArnold = new double[N][N];for (int i = 0; i < N; i++) {for (int j = 0; j < N; j++) {int X = (A11 * i + A12 * j) % N;int Y = (A21 * i + A22 * j) % N;afterArnold[X][Y] = beforeArnold[i][j];}}// 每轮置换beforeArnold = afterArnold;}

1 0