网站建设资讯

NEWS

网站建设资讯

逆矩阵java代码 矩阵求逆编程算法

如何用java程序利用二维数组创建一个矩阵,编写方法完成该矩阵的逆转,两个矩阵之和。

两个类,一个是矩阵对象类Matrix,另一个是测试类MatrixTest

创新互联公司基于分布式IDC数据中心构建的平台为众多户提供内蒙古服务器托管 四川大带宽租用 成都机柜租用 成都服务器租用。

可以实现矩阵创建,赋值,转置,加法,支持行列数不同的矩阵

注1,转置方法将输出一个新的矩阵,并不改变原有矩阵的内容

注2:加法方法是a.add(b),b不发生变化,a发生变化,加法将改变a矩阵的内容,不会产生新矩阵

public class Matrix {

private int rows;

private int columns;

private Integer[][] m;

// 行列构造法

public Matrix(int rows, int columns) {

this.rows = rows;

this.columns = columns;

this.m = new Integer[rows][columns];

}

// 二维数组构造法

public Matrix(Integer[][] m) {

this.m = m;

this.rows = m.length;

this.columns = m[0].length;

}

// 转置

public Matrix exchange() {

Integer[][] result = new Integer[columns][rows];

for (int i = 0; i rows; i++) {

for (int j = 0; j columns; j++) {

result[j][i] = m[i][j];

}

}

return new Matrix(result);

}

// 加法

public void add(Matrix obj) {

if (obj.getRows() != rows || obj.getColumns() != columns) {

System.out.println("不同行列的矩阵不能相加");

} else {

Integer[][] objarray = obj.toArray();

for (int i = 0; i rows; i++) {

for (int j = 0; j columns; j++) {

m[i][j] += objarray[i][j];

}

}

}

}

// 矩阵赋值

public void setValue(int row, int column, int value) {

if (row rows column columns) {

m[row][column] = value;

} else {

System.out.println("索引超出边界");

}

}

public int getRows() {

return rows;

}

public int getColumns() {

return columns;

}

public Integer[][] toArray() {

return m;

}

public String toString() {

String result = "";

for (int i = 0; i rows; i++) {

for (int j = 0; j columns; j++) {

result = result + m[i][j] + " ";

}

result += "\r\n";

}

return result;

}

}

public class MatrixTest {

public static void main(String[] args) {

Matrix m1 = new Matrix(2, 3);

for (int i = 0; i 2; i++) {

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

m1.setValue(i, j, i + j);

}

}

System.out.println(m1.toString());

System.out.println(m1.exchange().toString());

Matrix m2 = new Matrix(2, 3);

for (int i = 0; i 2; i++) {

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

m2.setValue(i, j, (i + 1) * (j + 1));

}

}

System.out.println(m2.toString());

m1.add(m2);

System.out.println(m1.toString());

}

}

java n*n矩阵求值及求逆矩阵

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;jn;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;in+10;i++)  

for(j=0;jn+10;j++)  

just[i][j]=1;  

for(i=1;i=n-1;i++)//求余子式矩阵   

for(j=1;j=n-1;j++)  

{  

if(i=numijnumj)  

just[i][j]=map[i+1][j];  

else if(i=numij=numj)  

just[i][j]=map[i+1][j+1];  

else if(inumij=numj)  

just[i][j]=map[i][j+1];  

else if(inumijnumj)  

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(mn)  

//      matrix.gcd(n,m);  

//      if(n==0)  

//      return m;  

//        

//      else  

//      return matrix.gcd(n,m%n);  

int mm=m;  

int nn=n;  

if(mmnn)  

{  

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*m0)  

{  

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;in+10;i++)  

for(j=0;jn+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如何编写求矩阵的逆矩阵

/**

* 求矩阵的逆矩阵 为矩阵右加一个单位矩阵后进行初等行变换,当左边变成单位矩阵时,右边就是求得的逆矩阵。 矩阵的初等行变换法则

* (1)交换变换:交换两行 (2)倍法变换:给一行数据乘以一个非0常数 (3)消法变换:把一行所有元素的k倍加到另一行的对应元素上去

* 将上述规则中的行换成列同样有效 只有方阵才可能有逆矩阵!

*

* @return

*/

public Matrix inverseMatrix() {

if (!this.isSquareMatrix()) {

System.out.println("不是方阵没有逆矩阵!");

return null;

}

// 先在右边加上一个单位矩阵。

Matrix tempM = this.appendUnitMatrix();

// 再进行初等变换,把左边部分变成单位矩阵

double[][] tempData = tempM.getMatrixData();

int tempRow = tempData.length;

int tempCol = tempData[0].length;

// 对角线上数字为0时,用于交换的行号

int line = 0;

// 对角线上数字的大小

double bs = 0;

// 一个临时变量,用于交换数字时做中间结果用

double swap = 0;

for (int i = 0; i tempRow; i++) {

// 将左边部分对角线上的数据等于0,与其他行进行交换

if (tempData[i][i] == 0) {

if (++line = tempRow) {

System.out.println("此矩阵没有逆矩阵!");

return null;

}

for (int j = 0; j tempCol; j++) {

swap = tempData[i][j];

tempData[i][j] = tempData[line][j];

tempData[line][j] = swap;

}

// 当前行(第i行)与第line行进行交换后,需要重新对第i行进行处理

// 因此,需要将行标i减1,因为在for循环中会将i加1。

i--;

// 继续第i行处理,此时第i行的数据是原来第line行的数据。

continue;

}

// 将左边部分矩阵对角线上的数据变成1.0

if (tempData[i][i] != 1) {

bs = tempData[i][i];

for (int j = tempCol - 1; j = 0; j--) {

tempData[i][j] /= bs;

}

// 将左边部分矩阵变成上对角矩阵,

// 所谓上对角矩阵是矩阵的左下角元素全为0

for (int iNow = i + 1; iNow tempRow; iNow++) {

for (int j = tempCol - 1; j = i; j--) {

tempData[iNow][j] -= tempData[i][j] * tempData[iNow][i];

}

}

}

}

// 将左边部分矩阵从上对角矩阵变成单位矩阵,即将矩阵的右上角元素也变为0

for (int i = 0; i tempRow - 1; i++) {

for (int iNow = i; iNow tempRow - 1; iNow++) {

for (int j = tempCol - 1; j = 0; j--) {

tempData[i][j] -= tempData[i][iNow + 1]

* tempData[iNow + 1][j];

}

}

}

// 右边部分就是它的逆矩阵

Matrix c = null;

int cRow = tempRow;

int cColumn = tempCol / 2;

double[][] cData = new double[cRow][cColumn];

// 将右边部分的值赋给cData

for (int i = 0; i cRow; i++) {

for (int j = 0; j cColumn; j++) {

cData[i][j] = tempData[i][cColumn + j];

}

}

// 得到逆矩阵,返回

c = new Matrix(cData);

return c;

}


网页标题:逆矩阵java代码 矩阵求逆编程算法
分享URL:http://cdweb.net/article/ddodgpo.html