猫脸映射中 数组引用传递的例子
来源:互联网 发布:数据库实例名是什么 编辑:程序博客网 时间: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
- 猫脸映射中 数组引用传递的例子
- 数组的引用传递
- //值传递 和引用 传递的区别 例子(数组和 对象引用传递 是类似的)
- 引用数组参数的传递
- Perl函数参数中传递数组和引用的使用
- Perl函数参数中传递数组和引用的使用
- C++中数组名、指针的引用传递
- java内存引用映射的例子
- PHP函数按引用传递的例子
- Java引用传递的一个例子
- Java值传递以及引用的传递、数组的传递!!
- Java值传递以及引用的传递、数组的传递!!
- Java值传递以及引用的传递、数组的传递!!
- Java值传递以及引用的传递、数组的传递!!
- Java值传递以及引用的传递、数组的传递!!
- Java值传递、引用传递、数组的传递
- 值传递、引用传递、数组传递的区别
- Java值传递,引用传递,数组的传递
- 芯片命名
- delphi7 手动安装 indy10.2.3
- 剑指offer:扑克牌顺子
- js笔记(6)
- ECharts使用小笔记
- 猫脸映射中 数组引用传递的例子
- 今天漫展,好想放假。但是这个图做不好我没心思玩
- Android多国语言的value文件夹命名方式
- Session原理和Tomcat实现分析
- Keil仿真调试
- [leetcode] 44. Wildcard Matching 解题报告
- 结构体---职工信息结构体(oj)
- easyui tree文本单击事件切换展开/折叠节点的状态
- javaEE SSH框架 qq第三方登录及用户绑定