您的位置:首页 > 其它

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

2016-04-02 15:27 330 查看
最近在做图像加密的程序设计,图像加密有一个比较有名的处理方法:猫脸映射。

我在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

; 这样就保证了每次的afterArnold数组都是新初始化的,而改变这个数组的值不会影响beforeArnold
数组。这样就达到了我们的目的。

正确代码
for (int k = 1; k <= arnoldChangeTimes; k++) {

double[][] afterArnold = new double

;

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: