猫脸映射中 数组引用传递的例子
2016-04-02 15:27
330 查看
最近在做图像加密的程序设计,图像加密有一个比较有名的处理方法:猫脸映射。
我在matlab中仿真实现了,然后将代码移植到java中,却发生了好些错误,这也让我加深了对猫脸映射的理解和对Java语言的理解。
猫脸映射的解释:http://book.51cto.com/art/201403/434289.htm
错误代码:
这段代码为什么是错误的呢?就是因为最下面的一句 beforeArnold = afterArnold;这个在Java里面是引用传递。是什么意思呢?就是说如果 afterArnold数组的值改变了,那么beforeArnold 数组的值也会改变。但是我们需要它不变,它一旦变了,那么迭代产生的数组也就改变了,所以这里是不行的。
那么怎么改变呢?很简单,在第一个for循环里面加一句: double[][] afterArnold = new double
; 这样就保证了每次的afterArnold数组都是新初始化的,而改变这个数组的值不会影响beforeArnold
数组。这样就达到了我们的目的。
正确代码
我在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; }
相关文章推荐
- leetcode——119——Pascal's Triangle II
- poj 1328 贪心
- 深入理解 Session 与 Cookie
- 粉尘传感器ZPH01驱动
- 码农小汪-锁 LOCK
- 数据库查询中的特殊字符的问题
- ListView 基本使用
- 华为 2016实习生 上机考试 题目
- 《古炉》其文
- LeetCode334. Increasing Triplet Subsequence
- 用Github Pages建了一个主页示例
- 36.leetcode题目338: Counting Bits(再做一遍)
- CSS3秘笈复习:第一章&第二章&第三章
- 创建型模式之工厂方法模式
- Android编程学习笔记 之 Fragment与Activity的数据传递
- RxJava实例(一)
- ScrollView中嵌套ListView时,listview高度显示的问题
- 学习进度条四
- SDAU2 课程练习2 1006
- 华为笔试题2