逆矩阵实现java代码
2015-07-17 01:56
661 查看
为了实现Hill密码,我们必须先实现如何求逆矩阵。
A的逆矩阵公式为 A*/|A|,我们需要分别求出A*、|A|。
为了求出我们的伴随矩阵,我们要实现几个步骤的方法: 1、实现求出(h,v)相应坐标下的余子式 2、实现求出一个矩阵的值 3、实现通过求代数余子式并转置来实现求逆矩阵
1、实现求出(h,v)相应坐标下的余子式
/* * 求(h,v)坐标的位置的余子式 */ public float[][] getConfactor(float[][] data, int h, int v) { int H = data.length; int V = data[0].length; float[][] newdata = new float[H-1][V-1]; for(int i=0; i<newdata.length; i++) { if(i < h-1) { for(int j=0; j<newdata[i].length; j++) { if(j < v-1) { newdata[i][j] = data[i][j]; }else { newdata[i][j] = data[i][j+1]; } } }else { for(int j=0; j<newdata[i].length; j++) { if(j < v-1) { newdata[i][j] = data[i+1][j]; }else { newdata[i][j] = data[i+1][j+1]; } } } } // for(int i=0; i<newdata.length; i ++) // for(int j=0; j<newdata[i].length; j++) { // System.out.println(newdata[i][j]); // } return newdata; }
2、实现求出一个矩阵的值
/* * 计算行列式的值 */ public float getMartrixResult(float[][] data) { /* * 二维矩阵计算 */ if(data.length == 2) { return data[0][0]*data[1][1] - data[0][1]*data[1][0]; } /* * 二维以上的矩阵计算 */ float result = 0; int num = data.length; float[] nums = new float[num]; for(int i=0; i<data.length; i++) { if(i%2 == 0) { nums[i] = data[0][i] * getMartrixResult(getConfactor(data, 1, i+1)); }else { nums[i] = -data[0][i] * getMartrixResult(getConfactor(data, 1, i+1)); } } for(int i=0; i<data.length; i++) { result += nums[i]; } // System.out.println(result); return result; }
3、实现通过求代数余子式并转置来实现求逆矩阵
public float[][] getReverseMartrix(float[][] data) { float[][] newdata = new float[data.length][data[0].length]; float A = getMartrixResult(data); // System.out.println(A); for(int i=0; i<data.length; i++) { for(int j=0; j<data[0].length; j++) { if((i+j)%2 == 0) { newdata[i][j] = getMartrixResult(getConfactor(data, i+1, j+1)) / A; }else { newdata[i][j] = -getMartrixResult(getConfactor(data, i+1, j+1)) / A; } } } newdata = trans(newdata); for(int i=0;i<newdata.length; i++) { for(int j=0; j<newdata[0].length; j++) { System.out.print(newdata[i][j]+ " "); } System.out.println(); } return newdata; } private float[][] trans(float[][] newdata) { // TODO Auto-generated method stub float[][] newdata2 = new float[newdata[0].length][newdata.length]; for(int i=0; i<newdata.length; i++) for(int j=0; j<newdata[0].length; j++) { newdata2[j][i] = newdata[i][j]; } return newdata2; }
最后,我们通过测试代码来验证
public class ReverseMartrix { static float[][] data = { {1,2,-1 }, {3,1,0 }, {-1,-1,-2 }, }; public static void main(String[] args) { // TODO Auto-generated method stub ReverseMartrix rm = new ReverseMartrix(); rm.getReverseMartrix(data); } ………………………… }
最后,需要源代码的,这里给出链接
链接: http://pan.baidu.com/s/1hqiwSTm 密码: dd9e
相关文章推荐
- JAVA 多线程(一)
- HDU3779 Railroad JAVA版题解+深搜
- java连接MySQL(从驱动下载到测试)
- 类与对象特征总结
- jdk动态代理(动态生成字节码与反射机制的结合)
- struts2 入门
- java设计模式学习之观察者模式(一)
- 解决 Error occurred during initialization of VM java/lang/NoClassDefFoundError: java/lang/O...
- Java实用I/O方法总结
- 【Java学习】Java泛型详解
- mac环境下装Eclipse+ADT做安卓开发,遇到R.java文件不参自动生成问题
- Java_web 乱码和一些地址输错的问题(原创)
- 【Java学习】Java迭代器
- 即将改变软件开发的5个Java9新特性
- SpringMVC错误总结
- Java实时监控日志文件并输出(已进行修改,运行没问题)
- springmvc 请求路径的问题
- struts (四) path DMI
- 深入理解Java:内省(Introspector)
- Java基础---IO流