查java实现逆矩阵转换的代码,居然没怎么发现,想偷懒一下也不行。关于矩阵基本运算 :加 减 乘,转置矩阵,相当简单,能看见不少别人写的,但是就是没看见逆矩阵,不爽。

自己实现了下逆矩阵功能,可以是任意的n阶矩阵。

因为对矩阵很陌生,从0开始到最后实现,每一步的思考代码都有体现,所以代码就很有思考的逻辑性。

实现分了两步:

A的逆矩阵=A*/|A|;

1:求A*

2:求|A|

伴随矩阵A* 实现,要用到代数余子式。实现还是比较简单

/**

* 1

* 求解代数余子式 输入:原始矩阵+行+列 现实中真正的行和列数目

*/

public static float[][] getDY(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];

}

}

}

}

// System.out.println("---------------------代数余子式测试.---------------------------------");

// for(int i=0;i

// for(int j=0;j

// System.out.print("newData["+i+"]"+"["+j+"]="+newData[i][j]+" ");

// }

//

// System.out.println();

// }

return newData;

}

写完这个代数余子式后就是计算它的行列式的值。

计算行列式是按照行和列展开,肯定是有递归的意思。但是由于和平时写的不太一样,循环太多,弄不清位置,就依次实现2阶,3阶,4阶,5阶行列式,并做了测试,用了归纳法找到了正确的实现位置。

2阶

/**

* 2

* 求2阶行列式的数值

* @param data

* @return

*/

public static float getHL2(float[][] data) {

// data 必须是2*2 的数组

float num1 = data[0][0] * data[1][1];

float num2 = -data[0][1] * data[1][0];

return num1 + num2;

}

3阶

/**

* 求3阶行列式的数值

*

* @param data

* @return

*/

public static float getHL3(float[][] data) {

float num1 = data[0][0] * getHL2(getDY(data, 1, 1));

float num2 = -data[0][1] * getHL2(getDY(data, 1, 2));

float num3 = data[0][2] * getHL2(getDY(data, 1, 3));

// System.out.println("---->"+num1);

// System.out.println("---->"+num2);

// System.out.println("---->"+num3);

System.out.println("3阶行列式的数值是:----->" + (num1 + num2 + num3));

return num1 + num2 + num3;

}

4阶

/**

* 求4阶行列式的数值

*

* @param data

* @return

*/

public static float getHL4(float[][] data) {

float num1 = data[0][0] * getHL3(getDY(data, 1, 1));

float num2 = -data[0][1] * getHL3(getDY(data, 1, 2));

float num3 = data[0][2] * getHL3(getDY(data, 1, 3));

float num4 = -data[0][3] * getHL3(getDY(data, 1, 4));

// System.out.println("--------->"+num1);

// System.out.println("--------->"+num2);

// System.out.println("--------->"+num3);

// System.out.println("--------->"+num4);

// System.out.println("4阶行列式的数值------->"+(num1+num2+num3+num4));

return num1 + num2 + num3 + num4;

}

5阶

/**

* 求5阶行列式的数值

*/

public static float getHL5(float[][] data) {

float num1 = data[0][0] * getHL4(getDY(data, 1, 1));

float num2 = -data[0][1] * getHL4(getDY(data, 1, 2));

float num3 = data[0][2] * getHL4(getDY(data, 1, 3));

float num4 = -data[0][3] * getHL4(getDY(data, 1, 4));

float num5 = data[0][4] * getHL4(getDY(data, 1, 5));

System.out.println("5 阶行列式的数值是: ------->"

+ (num1 + num2 + num3 + num4 + num5));

return num1 + num2 + num3 + num4 + num5;

}

最终的归纳是:

/**

* 求解行列式的模----------->最终的总结归纳

*

* @param data

* @return

*/

public static float getHL(float[][] data) {

// 终止条件

if (data.length == 2) {

return data[0][0] * data[1][1] - data[0][1] * data[1][0];

}

float total = 0;

// 根据data 得到行列式的行数和列数

int num = data.length;

// 创建一个大小为num 的数组存放对应的展开行中元素求的的值

float[] nums = new float[num];

for (int i = 0; i < num; i++) {

if (i % 2 == 0) {

nums[i] = data[0][i] * getHL(getDY(data, 1, i + 1));

} else {

nums[i] = -data[0][i] * getHL(getDY(data, 1, i + 1));

}

}

for (int i = 0; i < num; i++) {

total += nums[i];

}

System.out.println("total=" + total);

return total;

}

上面用到的是归纳。

实现了行列式求值还没完,下面才是求逆矩阵:

/**

* 求解3阶矩阵的逆矩阵

* @param data

* @return

*/

public static float[][] getN3(float[][] data) {

// 先是求出整个行列式的数值|A|

float A = getHL3(data);

float[][] newData = new float[3][3];

for (int i = 0; i < 3; i++) {

for (int j = 0; j < 3; j++) {

float num;

if ((i + j) % 2 == 0) {// i+j 是偶数 实际是(i+1)+(j+1)

num = getHL2(getDY(data, i + 1, j + 1));

} else {

num = -getHL2(getDY(data, i + 1, j + 1));

}

System.out.println("num=" + num);

newData[i][j] = num / A;

}

}

// 再转制

newData = getA_T(newData);

// 打印

for (int i = 0; i < 3; i++) {

for (int j = 0; j < 3; j++) {

System.out.print("newData[" + i + "][" + j + "]= "

+ newData[i][j] + " ");

}

System.out.println();

}

return newData;

}

最终的结果是:

/**

* 求解逆矩阵------>z最后的总结和归纳

*

* @param data

* @return

*/

public static float[][] getN(float[][] data) {

// 先是求出行列式的模|data|

float A = getHL(data);

// 创建一个等容量的逆矩阵

float[][] newData = new float[data.length][data.length];

for (int i = 0; i < data.length; i++) {

for (int j = 0; j < data.length; j++) {

float num;

if ((i + j) % 2 == 0) {

num = getHL(getDY(data, i + 1, j + 1));

} else {

num = -getHL(getDY(data, i + 1, j + 1));

}

newData[i][j] = num / A;

}

}

// 转置 代数余子式转制

newData = getA_T(newData);

// 打印

for (int i = 0; i < data.length; i++) {

for (int j = 0; j < data.length; j++) {

System.out.print("newData[" + i + "][" + j + "]= "

+ newData[i][j] + " ");

}

System.out.println();

}

return newData;

}

会用到转置矩阵,代码较为简单:

/**

* 取得转置矩阵

* @param A

* @return

*/

public static float[][] getA_T(float[][] A) {

int h = A.length;

int v = A[0].length;

// 创建和A行和列相反的转置矩阵

float[][] A_T = new float[v][h];

// 根据A取得转置矩阵A_T

for (int i = 0; i < v; i++) {

for (int j = 0; j < h; j++) {

A_T[j][i] = A[i][j];

}

}

System.out.println("取得转置矩阵 wanbi........");

return A_T;

}

下面是自己的测试:

/**

* @param args

*/

public static void main(String[] args) {

MartrixTest t = new MartrixTest();

// t.getDY(data6, 2, 3);

// getHL3(data3);

// getHL4(data4);

// getHL5(data5);

// getN3(data3);

// getHL(data5);

getN(data3);

}

static float[][] data6 = { { 1, 2, 3, 4, 5, 6 },

{ 1, 2, 3, 4, 5, 6 },

{ 3, 4, 3, 2, 2, 1 },

{ 1, 2, 3, 4, 5, 6 },

{ 1, 2, 3, 4, 5, 6 },

{ 1, 2, 3, 4, 5, 6 },

};

static float[][] data5 = { { 1, 2, 3, 4, 5 },

{ 2, 3, 4, 5, 1 },

{ 3, 4, 5, 1, 2 },

{ 4, 5, 1, 2, 3 },

{ 5, 1, 2, 3, 4 },

};

static float[][] data4 = { { 1, 0, -1, 2 },

{ -2, 1, 3, 1 },

{ 0, 2, 0, -2 },

{ 1, 3, 4, -2 },

};

static float[][] data3 = { {1,2,-1 },

{3,1,0 },

{-1,-1,-2 }, };

测试了5阶的,结果和课本例题其他解法结果相同。把摄影测量的图像处理原理和矩阵都学了下,搞了2天还是蛮爽的。

分享到:

2011-10-31 12:30

浏览 14851

评论

逆矩阵 java_用java实现逆矩阵运算相关推荐

  1. 逆矩阵 java_用java描述矩阵求逆的算法

    今天很开心把困扰几天的问题解决了,在学习线性代数这门课程的时候.想通过程序实现里面的计算方法,比如矩阵求逆,用java代码该如何描述呢? 首先,咱们先用我们所交流语言描述一下算法思路: 1.求出一个矩 ...

  2. numpy求逆矩阵_线性代数精华2——逆矩阵的推导过程

    点击上方蓝字,和我一起学技术. 上一讲当中我们复习了行列式的内容,行列式只是开胃小菜,线性代数的大头还是矩阵. 矩阵的定义很简单,就是若干个数按照顺序排列在一起的数表.比如m * n个数,排成一个m ...

  3. JAVA简单大数运算

    在准备蓝桥杯比赛的时候,偶然间老师说在大数运算中java有这巨大的优势,刚好自己也在学习java,于是就查了一些资料,看了一下,java的大数运算,看完之后确实感觉比c/c++语言要方便的多.于是就写 ...

  4. Java 实现位运算计算加减乘除

    机器数和机器数的真值 一个数在计算机中的二进制表示形式,叫做这个数的机器数.机器数是带符号的,在计算机用机器数的最高位存放符号,正数为0,负数为1.举个例子,比如在机器字长为8位的情况下(机器字长是指 ...

  5. 算法之美 | 位运算的巧妙奥秘(一) | JAVA中位运算的深入浅出

    文章目录 前言 一.位运算符号 二.位运算的运算规则 扩展 前言 传智杯初赛后有感而写,我目前阶段所学习的算法,只是最基础的数学,对于数字和数学公式还是不敏感,在小卡与质数2那道题,解题的思路只有最基 ...

  6. Java大数字运算(BigInteger类和BigDecimal类)

    Java中的超大数BIgInteger和BigDecimal 在我们处理大位数运算的时候,我们经常用的int和long类型的数已经不能够满足我们的运算了,那么这个时候就需要用到一个超大数来运算,这个时 ...

  7. java 四则混合运算_Java实现四则混合运算代码示例

    使用栈来实现,可以处理运算优先级. 使用自然四则运算表达式即可,如:4+(3*(3-1)+2)/2.无需把表达式先转换为逆波兰等形式. package com.joshua.cal; import j ...

  8. java程序设计复数运算_Java实现复数运算

    <Java实现复数运算>由会员分享,可在线阅读,更多相关<Java实现复数运算(2页珍藏版)>请在人人文库网上搜索. 1.定义一个复数类complex,它的内部具有两个实例变量 ...

  9. java取余运算“%”

    @java取余运算"%" demo public static void main(String[] args) {System.out.println(5%3);System.o ...

最新文章

  1. 897B. Chtholly's request#长度为偶数的回文数(模拟)
  2. 光储充一体化充电站_【储能项目】深圳宝清240kW/500kWh光储充电站项目
  3. Dubbo 源码分析 - 服务引用
  4. mysql查找字符串最后位置_mysql查找字符串出现位置
  5. 计算机自适应测试的应用 托福,计算机自适应测试系统的研究和应用.pdf
  6. P4457-[BJOI2018]治疗之雨【期望dp,高斯消元】
  7. PHP利用Mysql锁解决高并发
  8. vue 日期格式化返回指定个数月份_python时间与日期处理一次看个够(time、datetime、calendar)...
  9. Unity3D之UGUI基础7:Scrollbar卷动条
  10. 有关C#中的引用类型的内存问题
  11. 2017年Android恶意软件专题报告
  12. 创建create-react-app myapp项目报错
  13. 生日那天,我失恋了!!
  14. tushare获得股票数据后进行数据合并
  15. python如何转换图形_python绘图 转
  16. 阿里云国际站代理商:利用RDS MySQL数据库云开发ToDo List
  17. 数据库原理之候选码的判断方法
  18. pure virtual method called 纯虚函数被调用原理分析
  19. python程序填空_python练习题-基础巩固-第一周
  20. YX一周面试题911-918

热门文章

  1. 墙裂推荐|7款运营工具,能帮你提升90%的效率,高效完成KPI任务
  2. 学习笔记:VB.net动态添加控件数组并传递事件
  3. Windows反调试技术全攻略
  4. 高瓴资本张磊:谁的研究更深刻,谁就能为风险定价
  5. c++ 植物大战僵尸中文版call源码
  6. Pixy原理及Opencv实现
  7. 电脑桌面图标消失变白格子?附一键修复脚本
  8. 2023年长安大学交通运输专硕上岸经验
  9. mysql多字段修改update_docker安装mysql容器进行部署
  10. s6 android 6.0,三星Android 6.0更新升级详细名单:只有国行S6 Edge(G9250)