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

本文探讨了图像加密中的猫脸映射方法,并通过对比MATLAB与Java实现,揭示了Java中数组引用传递的问题及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值