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<List<Double>> matrix; private int lineNum; private int columnNum; private double determinantValue; private List<List<Double>> adjointMatrix; public List<List<Double>> getMatrix() { return matrix; } public double getDeterminantValue() { return determinantValue; } public void setMatrix(List<List<Double>> matrix) { this.matrix = matrix; } public void setDeterminantValue(double determinantValue) { this.determinantValue = determinantValue; } public InverseOfMatrix2(List<List<Double>> 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<List<Double>> tempList = new ArrayList<List<Double>>(); for(List<Double> l : matrix){ List<Double> newList = new ArrayList<Double>(); 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<List<Double>>();//伴随矩阵 for(int i = 0; i < lineNum; i++){ List<Double> line = new ArrayList<Double>(); adjointMatrix.add(line); for(int j = 0; j < columnNum; j++){ List<List<Double>> list = new ArrayList<List<Double>>();//余子式 for(int t = 0; t < lineNum; t++){ if(i == t){ continue; } List<Double> newList = new ArrayList<Double>(); 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<List<Double>> data) { int i = 0, j = 0; for (List<Double> 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<List<Double>> matrix = new ArrayList<List<Double>>(); for(int i = 0; i < lineNum; i++){ System.out.println("请输入第" + (i + 1) + "行的数,用逗号分隔:"); String lineData = scanner.next(); String[] lineDataArr = lineData.split(","); List<Double> line = new ArrayList<Double>(); 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(); } } }
相关推荐
求逆矩阵的方法与矩阵的秩 一、矩阵的初等行变换 (由定理2.4给出的求逆矩阵的伴随矩阵法,要求计算矩阵A的行列式 ...下面介绍利用矩阵初等行变换求逆矩阵的方法.在介绍这种方法之前,先给出矩阵初等行变换的定义.)
复数矩阵求逆
1.求矩阵的crout(LU)分解,其中L为下三角矩阵,U为上三角矩阵 2.求L,U矩阵的伴随阵,参考文献:三角形矩阵求伴随矩阵的一种方法(曾月新) 3.求L,U矩阵的逆(伴随阵A* /det(A)) 4.inv_A = inv_U * inv_L
该资源是对于多入多出矩阵求逆的C++编程语言实现,用于多入多出的矩阵求逆算法,本人是用机器人系统设计控制算法,亲自验证代码的可行性
求N阶矩阵的逆矩阵,由java编写,经测试完全正确,很好用。
在进行矩阵求逆等计算时遇到矩阵条件数较大导致病态时,常用的各种解决病态方程方法
矩阵求逆在编程过程中会经常用到,所以一个简单而实用的矩阵求逆对于顺利的编好程序是十分有用处的
本人使用C语言编写使用初等行变换的方法,求出矩阵的逆矩阵。
矩阵求逆矩阵求逆矩阵求逆矩阵求逆矩阵求逆矩阵求逆
Gauss-Jordan法实矩阵求逆 求4阶矩阵的逆矩阵 算法很实用啊
基于FPGA的复数矩阵求逆设计.pdf
DSP C6000矩阵求逆运算实现。通过调用芯片自带库函数实现,无需自己编写C程序。内含调用说明和例程。
通过运用数组指针,用简单的c语言完成矩阵的逆运算。
一种简单的求矩阵的逆矩阵的程序,且自动处理不可逆时候的情况
2.领域:矩阵求逆 3.内容:在vivado2019.2平台下通过verilog开发的7x7矩阵求逆功能,带testbench 4.注意事项:FPGA工程路径,需要英文路径,且路径的字母个数不能大于148。具体仿真可参考提供的操作录像。
7*7矩阵求逆的verilog实现 Inverse_of_Matrix(o00, o01, o02, o03, o04, o05, o06, o07, o08, o09, o10, o11, o12, o13, o14, o15, o16, o17, o18, o19, o20, o21, o22, o23, o24, o25, o26, o27, o28, o29, o30...
VB矩阵求逆
这是利用高斯列主元消元法求矩阵逆的C语言实现,可以直接在编译环境下运行