java求矩阵的逆_矩阵求逆(JAVA)利用伴随矩阵

package gaodai.matrix;

import gaodai.determinant.DeterminantCalculation;

import java.util.ArrayList;

import java.util.List;

import java.util.Scanner;

/**

* 矩阵求逆(利用伴随矩阵)

* @author 邱万迟

*

*/

public class InverseOfMatrix2 {

private List> matrix;

private int lineNum;

private int columnNum;

private double determinantValue;

private List> adjointMatrix;

public List> getMatrix() {

return matrix;

}

public double getDeterminantValue() {

return determinantValue;

}

public void setMatrix(List> matrix) {

this.matrix = matrix;

}

public void setDeterminantValue(double determinantValue) {

this.determinantValue = determinantValue;

}

public InverseOfMatrix2(List> data){

matrix = data;

lineNum = data.size();

columnNum = data.get(0).size();

}

public void caculate() throws Exception{

//1.非方正不能求逆

//2.方正的行列式值为零不能求逆

if( lineNum != columnNum){

throw new Exception("此矩阵不能求逆>>>>>>>>>>>>>>>>>");

}

List> tempList = new ArrayList>();

for(List l : matrix){

List newList = new ArrayList();

newList.addAll(l);

tempList.add(newList);

}

DeterminantCalculation d = new DeterminantCalculation(tempList);

d.chang2UpperTriangle();

double result = d.getValue();

if(result == 0){

throw new Exception("此矩阵不能求逆>>>>>>>>>>>>>>>>>");

}

determinantValue = result;

adjointMatrix = new ArrayList>();//伴随矩阵

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

List line = new ArrayList();

adjointMatrix.add(line);

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

List> list = new ArrayList>();//余子式

for(int t = 0; t < lineNum; t++){

if(i == t){

continue;

}

List newList = new ArrayList();

list.add(newList);

for(int k = 0; k < columnNum; k++){

if(j == k){

continue;

}

newList.add(matrix.get(t).get(k));

}

}

DeterminantCalculation determinant = new DeterminantCalculation(list);

determinant.chang2UpperTriangle();

double tempValue = determinant.getValue();

int sign = getSign(i, j);

System.out.println( "(" + i + j + ")的余子式:" + tempValue);

line.add(sign * tempValue);

}

}

System.out.println("伴随矩阵的转置>>>>>>>>>>>>>>>>>>>>");

print(adjointMatrix);

int lineNum = adjointMatrix.size();

int columnNum = adjointMatrix.get(0).size();

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

for(int j = i; j < columnNum; j++){

double t = adjointMatrix.get(i).get(j);

adjointMatrix.get(i).set(j,adjointMatrix.get(j).get(i));

adjointMatrix.get(j).set(i,t);

}

}

System.out.println("伴随矩阵如下>>>>>>>>>>>>>>>>>>>>");

print(adjointMatrix);

System.out.println("逆矩阵如下>>>>>>>>>>>>>>>>>>>>");

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

for(int j = i; j < columnNum; j++){

adjointMatrix.get(i).set(j,adjointMatrix.get(i).get(j) / determinantValue);

}

}

print(adjointMatrix);

}

private int getSign(int i,int j){

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

return 1;

}

return -1;

}

/**

* 打印

*/

public void print(List> data) {

int i = 0, j = 0;

for (List line : data) {

for (double element : line) {

System.out.print(element);

System.out.print("(" + i + "," + j + ") ");

System.out.print(" ");

j++;

}

System.out.println();

i++;

j = 0;

}

System.out.println();

}

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

System.out.println("请输入矩阵的行数与列数,用逗号分隔:");

String sn = scanner.next();

String[] snArr = sn.split(",");

int lineNum = Integer.valueOf(snArr[0]);

int columnNum = Integer.valueOf(snArr[1]);

List> matrix = new ArrayList>();

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

System.out.println("请输入第" + (i + 1) + "行的数,用逗号分隔:");

String lineData = scanner.next();

String[] lineDataArr = lineData.split(",");

List line = new ArrayList();

matrix.add(line);

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

line.add(Double.valueOf(lineDataArr[j]));

}

}

InverseOfMatrix2 m = new InverseOfMatrix2(matrix);

m.print(m.getMatrix());

try {

m.caculate();

} catch (Exception e) {

e.printStackTrace();

}

}

}

?

?

原文:http://qiuwanchi.iteye.com/blog/2221605

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值