本文实例讲述了java实现的n*n矩阵求值及求逆矩阵算法。分享给大家供大家参考,具体如下:
先来看看运行结果:
java版的写出来了,用的跟c语言相同的算法,然后看看能不能以后加个框做成程序:
import java.math.*; import java.util.*; import java.text.*; public class matrix { static int map1[][]=new int [110][110]; static int just[][]=new int [110][110]; public static void printf(int n,int map[][]) { int i,j; for(i=1;i<=n;i++ ) { for(j=1;j<n;j++) System.out.print(map[i][j]+" "); System.out.println(map[i][j]); } } public static void get(int numi,int numj,int map[][],int n) { int i,j,k,l; for(i=0;i<n+10;i++) for(j=0;j<n+10;j++) just[i][j]=1; for(i=1;i<=n-1;i++)//求余子式矩阵 for(j=1;j<=n-1;j++) { if(i>=numi&&j<numj) just[i][j]=map[i+1][j]; else if(i>=numi&&j>=numj) just[i][j]=map[i+1][j+1]; else if(i<numi&&j>=numj) just[i][j]=map[i][j+1]; else if(i<numi&&j<numj) just[i][j]=map[i][j]; } } //static int map[][]=new int [110][110]; public static int getans(int nn) { int map[][]=new int [110][110]; for(int i=1;i<=nn;i++) for(int j=1;j<=nn;j++) map[i][j]=just[i][j]; if(nn==2) return map[1][1]*map[2][2]-map[1][2]*map[2][1]; else if(nn==1) return map[1][1]; else { int cnb=0; for(int i=1;i<=nn;i++) { get(1,i,map,nn);//得到当前余子式 just // printf("pay attention!\n"); //print(map,nn); //print(just,nn-1); if(i%2==1) cnb+=map[1][i]*getans(nn-1); else cnb-=map[1][i]*getans(nn-1); } return cnb; } } public static int gcd(int m,int n) { // if(m<n) // matrix.gcd(n,m); // if(n==0) // return m; // // else // return matrix.gcd(n,m%n); int mm=m; int nn=n; if(mm<nn) { int c=mm; mm=nn; nn=c; } int w=1; while(w!=0) { w=mm%nn; mm=nn; nn=w; } return mm; } public static void ans(int n,int m) { if(n*m<0) { System.out.print("-"); ans(Math.abs(n),Math.abs(m)); return ; } if(m==1) System.out.print(n+"\t"); else if(n%m==0) System.out.print(n/m+"\t"); else System.out.print((n/matrix.gcd(m, n))+"/"+(m/matrix.gcd(m, n))+"\t"); } public static void main(String[] args) { // TODO 自动生成的方法存根 Scanner cin=new Scanner(System.in); int i,j,k,l,m,p; while(true) { int n=cin.nextInt(); int ans=0; for(i=0;i<n+10;i++) for(j=0;j<n+10;j++) map1[i][j]=1; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { map1[i][j]=cin.nextInt(); just[i][j]=map1[i][j]; } int ans1=matrix.getans(n); System.out.println("矩阵的值为:"); System.out.println(ans1); int map2[][]=new int [110][110]; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { map2[i][j]=map1[j][i]; just[i][j]=map2[i][j]; } System.out.println("转置矩阵为:"); matrix.printf(n, map2); int help2=matrix.getans(n); System.out.println(help2); if(help2==0) { System.out.println("No inverse matrix"); continue; } System.out.println("逆矩阵为:"); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { matrix.get(i, j, map2, n); //boolean b=((i+j)%2==0); if((i+j)%2==0) matrix.ans(matrix.getans(n-1), help2); else matrix.ans(matrix.getans(n-1)*-1, help2); } System.out.println(); } System.out.println(); } } }
更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
本文向大家介绍Java实现的求逆矩阵算法示例,包括了Java实现的求逆矩阵算法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java实现的求逆矩阵算法。分享给大家供大家参考,具体如下: 运行结果: 更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
问题内容: 我正在尝试计算Java中的逆矩阵。 我遵循伴随方法(首先计算伴随矩阵,然后转置该矩阵,最后将其乘以行列式值的倒数)。 当矩阵不太大时有效。我检查过,对于尺寸最大为12x12的矩阵,可以快速提供结果。但是,当矩阵大于12x12时,完成计算所需的时间呈指数增长。 我需要反转的矩阵是19x19,并且花费太多时间。消耗更多时间的方法是用于行列式计算的方法。 我使用的代码是: 有人知道如何更有效
我目前正在做一个音频信号处理项目,需要在Java中的一个复杂矩阵上使用SVD。我当前的线性代数库是Apache Commons。但它只提供实矩阵的SVD,JAMA、JBLAS、EJML、ojAlgo都不支持复杂的SVD。 我一直在用一些技巧从一个等效的实矩阵中找到SVD。然而,当我重建矩阵时,这种技术对于虚部有很大的不准确性。
我想取一个nxn矩阵的逆矩阵,用于我的GraphSlam。 我遇到的问题: <代码>。inverse()特征库(3.1.2)不允许零值,返回NaN LAPACK(3.4.2)库不允许使用零行列式,但允许使用零值(使用C中使用LAPACK计算矩阵逆的示例代码) 由于某种原因,Seldon库(5.1.2)无法编译 是否有人成功实现了允许负值、零值和零行列式的n x n矩阵反演代码?有什么好的库(C)推
本文向大家介绍详解用java描述矩阵求逆的算法,包括了详解用java描述矩阵求逆的算法的使用技巧和注意事项,需要的朋友参考一下 今天很开心把困扰几天的问题解决了,在学习线性代数这门课程的时候。想通过程序实现里面的计算方法,比如矩阵求逆,用java代码该如何描述呢? 首先,咱们先用我们所交流语言描述一下算法思路: 1.求出一个矩阵A对应的行列式在第i,j(i表示行,j表示列)位置的余子式(余子式前面
现在,我想我明白了这个概念。但是当我把它们都放入代码中时,它就不起作用了…… 首先,我试图将矩阵转换为上三角矩阵,但由于某种原因,在第2列之后,它停止工作。。 我输入的数组是: [1.00][5.00][4.00][4.00][1.00] [5.00] [7.00] [7.00] [4.00] [8.00] [7.00] [4.00] [8.00] [4.00] [7.00] [10.00][12