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(); } } }
相关推荐
在这个场景中,"ConsoleApplication1"可能是一个包含C#、Java或C++等编程语言编写的源代码,用于实现矩阵求逆的算法。 矩阵求逆在很多领域都有应用,包括图像处理、物理模拟、工程计算和数据分析。求逆的方法有多种...
3.LU分解或QR分解:先将矩阵分解为低秩矩阵和上三角矩阵,再利用这些分解来求逆。 在实际编程中,为了提高效率和避免溢出,通常采用数值稳定的方法,如基于Householder变换的QR分解或使用LAPACK库。然而,"matrix-...
通过设置Excel表格和利用其内置的函数,例如矩阵乘法和矩阵求逆,用户可以非常方便地求出法方程的解,这为不熟悉MatLab或其他高级数学软件的学生和研究人员提供了一个容易上手的解决方案。 总结来说,条件平差作为...
数据结构与算法分析是计算机科学中的核心课程,它关乎如何高效地存储和处理数据,以及设计和实现高效的算法。在Java编程环境下,这些概念尤...在Java环境下,可以利用其丰富的库和工具进一步优化数据结构和算法的实现。
- **矩阵乘法操作符**:在Java中直接支持高效的矩阵乘法运算。 - **文件系统链接**:允许在Java的文件系统中创建软链接和硬链接。 - **增强的开关表达式**:扩展了Java的switch语句,使其更像一个表达式而非语句。 ...
在实现3D旋转特效时,开发者可以使用各种编程语言,如C++、Java、Python等,结合相应的图形库,如OpenGL、Direct3D、Unity3D等。这些库提供了一系列API,帮助程序员轻松实现3D对象的旋转、平移和缩放。例如,OpenGL...
常见的并行编程模型有OpenMP、MPI(Message Passing Interface)、CUDA(用于GPU编程)和多线程编程(如Java的JVM线程、C++的std::thread)。OpenMP是一种用于共享内存系统的API,允许程序员通过简单的指令来实现...
4. **动画**:消除效果通常会伴随炫酷的动画,例如淡入淡出、缩放、旋转等。LibGDX的动画系统可以帮助实现这些效果。 5. **音效和音乐**:每次操作和成功消除都会有对应的音效,游戏背景音乐也需要流畅切换。 6. *...
- **知识点**:数值计算是指利用计算机来解决科学研究与工程计算中的数学问题的过程。这些计算通常涉及大量的数学运算,例如矩阵运算、微积分求解等,是计算机应用的一个重要方面。 - **应用场景**:在科学研究、...
Matrix是一个2D矩阵,可以用来对图像进行平移、旋转、缩放等操作。通过设置ImageView的imageMatrix属性,我们可以改变图片的显示效果。 3. **OnScaleGestureListener**:ScaleGestureDetector需要一个...
手册的前言部分阐明了编写目的,即向读者介绍自动微分的标准形式以及提供大量正向模式和反向模式自动微分的切线和伴随规则,涵盖了大多数常用的标量、向量、矩阵和概率函数。 自动微分的方法主要有两种:正向模式...
5. 编程语言与框架:实现锥体跳动可能需要使用像C++、C#、Java这样的编程语言,配合Unity、Unreal Engine、Three.js等游戏引擎或图形库。这些工具提供了丰富的API和功能,帮助开发者快速构建动态效果。 6. 动画系统...