逆矩阵 java_用java实现逆矩阵运算
查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实现逆矩阵运算相关推荐
- 逆矩阵 java_用java描述矩阵求逆的算法
今天很开心把困扰几天的问题解决了,在学习线性代数这门课程的时候.想通过程序实现里面的计算方法,比如矩阵求逆,用java代码该如何描述呢? 首先,咱们先用我们所交流语言描述一下算法思路: 1.求出一个矩 ...
- numpy求逆矩阵_线性代数精华2——逆矩阵的推导过程
点击上方蓝字,和我一起学技术. 上一讲当中我们复习了行列式的内容,行列式只是开胃小菜,线性代数的大头还是矩阵. 矩阵的定义很简单,就是若干个数按照顺序排列在一起的数表.比如m * n个数,排成一个m ...
- JAVA简单大数运算
在准备蓝桥杯比赛的时候,偶然间老师说在大数运算中java有这巨大的优势,刚好自己也在学习java,于是就查了一些资料,看了一下,java的大数运算,看完之后确实感觉比c/c++语言要方便的多.于是就写 ...
- Java 实现位运算计算加减乘除
机器数和机器数的真值 一个数在计算机中的二进制表示形式,叫做这个数的机器数.机器数是带符号的,在计算机用机器数的最高位存放符号,正数为0,负数为1.举个例子,比如在机器字长为8位的情况下(机器字长是指 ...
- 算法之美 | 位运算的巧妙奥秘(一) | JAVA中位运算的深入浅出
文章目录 前言 一.位运算符号 二.位运算的运算规则 扩展 前言 传智杯初赛后有感而写,我目前阶段所学习的算法,只是最基础的数学,对于数字和数学公式还是不敏感,在小卡与质数2那道题,解题的思路只有最基 ...
- Java大数字运算(BigInteger类和BigDecimal类)
Java中的超大数BIgInteger和BigDecimal 在我们处理大位数运算的时候,我们经常用的int和long类型的数已经不能够满足我们的运算了,那么这个时候就需要用到一个超大数来运算,这个时 ...
- java 四则混合运算_Java实现四则混合运算代码示例
使用栈来实现,可以处理运算优先级. 使用自然四则运算表达式即可,如:4+(3*(3-1)+2)/2.无需把表达式先转换为逆波兰等形式. package com.joshua.cal; import j ...
- java程序设计复数运算_Java实现复数运算
<Java实现复数运算>由会员分享,可在线阅读,更多相关<Java实现复数运算(2页珍藏版)>请在人人文库网上搜索. 1.定义一个复数类complex,它的内部具有两个实例变量 ...
- java取余运算“%”
@java取余运算"%" demo public static void main(String[] args) {System.out.println(5%3);System.o ...
最新文章
- 897B. Chtholly's request#长度为偶数的回文数(模拟)
- 光储充一体化充电站_【储能项目】深圳宝清240kW/500kWh光储充电站项目
- Dubbo 源码分析 - 服务引用
- mysql查找字符串最后位置_mysql查找字符串出现位置
- 计算机自适应测试的应用 托福,计算机自适应测试系统的研究和应用.pdf
- P4457-[BJOI2018]治疗之雨【期望dp,高斯消元】
- PHP利用Mysql锁解决高并发
- vue 日期格式化返回指定个数月份_python时间与日期处理一次看个够(time、datetime、calendar)...
- Unity3D之UGUI基础7:Scrollbar卷动条
- 有关C#中的引用类型的内存问题
- 2017年Android恶意软件专题报告
- 创建create-react-app myapp项目报错
- 生日那天,我失恋了!!
- tushare获得股票数据后进行数据合并
- python如何转换图形_python绘图 转
- 阿里云国际站代理商:利用RDS MySQL数据库云开发ToDo List
- 数据库原理之候选码的判断方法
- pure virtual method called 纯虚函数被调用原理分析
- python程序填空_python练习题-基础巩固-第一周
- YX一周面试题911-918
热门文章
- 墙裂推荐|7款运营工具,能帮你提升90%的效率,高效完成KPI任务
- 学习笔记:VB.net动态添加控件数组并传递事件
- Windows反调试技术全攻略
- 高瓴资本张磊:谁的研究更深刻,谁就能为风险定价
- c++ 植物大战僵尸中文版call源码
- Pixy原理及Opencv实现
- 电脑桌面图标消失变白格子?附一键修复脚本
- 2023年长安大学交通运输专硕上岸经验
- mysql多字段修改update_docker安装mysql容器进行部署
- s6 android 6.0,三星Android 6.0更新升级详细名单:只有国行S6 Edge(G9250)