package gaodai;import java.util.List;/*** N阶行列式计算* @author 邱万迟**/
public class DeterminantCalculation {public DeterminantCalculation(List<List<Double>> determinant){this.determinant = determinant;this.sign = 1;}private List<List<Double>> determinant;private int sign;private int caculateTimes;/*** 转置*/public void transpose(){int lineNum = determinant.size();int columnNum = determinant.get(0).size();for(int i = 0; i < lineNum; i++){for(int j = i; j < columnNum; j++){double t = determinant.get(i).get(j);determinant.get(i).set(j,determinant.get(j).get(i));determinant.get(j).set(i,t);}}}/*** 获取行列式的值* @return*/public double getValue(){double temp = 1.0;for(int i = 0; i < determinant.size(); i++){temp *= determinant.get(i).get(i);}return Math.round((temp * getSign()) * 100)/100.0;}/*** a行与b行互换(两行互换)* @param determinant 行列式* @param a 行号* @param b 行号* @throws Exception */public void changeLine(int a,int b) throws Exception{if(a < 1 || a > determinant.size() || b < 1 || b > determinant.size()){throw new Exception("输入的行号不合法");}List<Double> aLine = determinant.get(a - 1);List<Double> bLine = determinant.get(b - 1);determinant.set(a - 1, bLine);determinant.set(b - 1, aLine);changeSign();System.out.println("第" + a + "行与" + b + "行互换");}/*** 两列互换* @param a* @param b* @throws Exception */public void changeColumn(int a,int b) throws Exception{if(a < 1 || a > determinant.get(0).size() || b < 1 || b > determinant.get(0).size()){throw new Exception("输入的列号不合法");}for(int i = 0; i < determinant.size(); i++){double temp = determinant.get(i).get(a - 1);determinant.get(i).set(a - 1,determinant.get(i).get(b - 1));determinant.get(i).set(b - 1,formateDouble(temp));}changeSign();}/*** a行加到b行上* @param a* @param b* @throws Exception */public void lineAdd2OtherLine(int a, int b) throws Exception{lineMultiplyNumAdd2OtherLine(1, a, b);}/*** 第a行乘以number 加到第b行上* @param number 乘以的数* @param a行号* @param b行号* @throws Exception */public void lineMultiplyNumAdd2OtherLine(double number,int a, int b) throws Exception{if(a < 1 || a > determinant.size() || b < 1 || b > determinant.size()){throw new Exception("输入的行号不合法");}List<Double> aLine = determinant.get(a - 1);List<Double> bLine = determinant.get(b - 1);for(int i = 0; i < bLine.size(); i++){double temp = bLine.get(i) + aLine.get(i) * number;bLine.set(i, formateDouble(temp));}System.out.println("第" + a + "行乘以" + number + "加到第" + b + "行:");print();}public double formateDouble(double data){return Math.round(data * 10000000000L)/10000000000.0;}/*** a列加到b列* @param a* @param b*/public void columnAdd2OtherColumn(int a, int b){columnMultiplyNumAdd2OtherColumn(1, a, b);}/*** 第a列乘以number 加到第b列上* @param number 乘以的数* @param a行号* @param b行号*/public void columnMultiplyNumAdd2OtherColumn(double number,int a, int b){for(int i = 0; i < determinant.size(); i++){double temp = determinant.get(i).get(b - 1) + determinant.get(i).get(a - 1) * number;determinant.get(i).set(b - 1, temp);}}/*** 校验是否是上三角,不是就的继续计算* @return*/public boolean isCaculate(){boolean hasCaculate = false;for(int i = 0; i < determinant.size(); i++){for(int j = 0; j < i; j++){if(determinant.get(i).get(j) != 0.0){System.out.println("(" + (i + 1) + "," + (j + 1) + ")元素值不为零");hasCaculate = true;break;}}if(hasCaculate){break;}}//System.out.println("isUpperTriangle?>>>>>>>>>>>" + hasCaculate);return hasCaculate;}/*** @throws Exception * 变为上三角* @throws  */public void chang2UpperTriangle() throws Exception{if(!isCaculate()){return;}caculateTimes++;System.out.println("----------------------------------第" + caculateTimes + "次计算----------------------------------");for(int i = 0; i < determinant.size(); i++){for(int j = i + 1; j < determinant.size(); j++){if(determinant.get(i).get(i) == 0){//每一行在对角线上元素是零就互换行changeLine(i + 1, j + 1);print();continue;}double multiplyNum = -1 * determinant.get(j).get(i) / determinant.get(i).get(i);if(multiplyNum == 0){continue;}this.lineMultiplyNumAdd2OtherLine(multiplyNum, (i + 1), (j + 1));}}print();chang2UpperTriangle();}/*** 获取a行b列元素所在的下一个非零元素所在的行* @param a* @param b*/public int getNotZeroLineByColumn(int a,int b){for(int i = a + 1; i < determinant.size(); i++){if(determinant.get(i).get(b) != 0){return i;}}return 0;}/*** 改变符号*/private void changeSign(){this.sign = this.sign * -1;}public void print(){int i = 0,j = 0;for(List<Double> line : determinant){for(double element : line){System.out.print(element);//System.out.print(Math.round(element*100)/100.0);System.out.print("(" + i + "," + j + ")  ");System.out.print("  ");j++;}System.out.println();i++;j = 0;}System.out.println();}public List<List<Double>> getDeterminant() {return determinant;}public void setDeterminant(List<List<Double>> determinant) {this.determinant = determinant;}public int getSign() {return sign;}
}
package gaodai;import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;import org.apache.commons.lang.StringUtils;public class Test {public static void main(String[] args) {int lineNum = 0;Scanner scanner = new Scanner(System.in);boolean flag = true;System.out.println("请输入行列式的阶数,系统会随机生成行列式里的数:");while(flag){ String num = scanner.next();if(StringUtils.isNotBlank(num)){try {lineNum = Integer.valueOf(num);} catch (Exception e) {lineNum = 0;}if(lineNum < 1){System.out.println("请重新输入(需是整数且大于零)");}else{flag = false;}}else{System.out.println("请重新输入(需是整数且大于零)");}}int columnNum = lineNum;List<List<Double>> result = new ArrayList<List<Double>>();for(int i = 0; i < lineNum; i++){List<Double> temp = new ArrayList<Double>();for(int j = 0; j < columnNum; j++){temp.add((double) (int)(Math.random()*10 + 1));}result.add(temp);}DeterminantCalculation determinant = new DeterminantCalculation(result);System.out.println("初始化行列式:");determinant.print();determinant.transpose();determinant.print();try {determinant.chang2UpperTriangle();} catch (Exception e) {e.printStackTrace();}determinant.print();System.out.println("行列式值为:" + determinant.getValue());}}

JAVA实现的N阶行列式计算,一起分享学习,有不足之处还望指正批评。

N阶行列式计算(JAVA)相关推荐

  1. n阶行列式计算----c语言实现(完结)

    花了半天时间,写了这个n阶行列式计算的程序,应该算是比较优美吧,有很多地方多次做了优化,程序占用内存不是很大,要是说小吧,也不合适,因为里边有一个递归,而且递归的深度还比较深.时间复杂度具体没有细看, ...

  2. C语言展开法和全排列法实现n阶行列式计算

    在这里向大家介绍两种实现n阶行列式计算的方法 目录 1.展开法 2.全排列法 一.展开法: 展开法的实现思想就是利用递归不断将行列式某一行或者某一列的n-1个(假设行列式为n行n列)置为0,剩余一个置 ...

  3. 蓝桥杯 算法训练 ALGO-932低阶行列式计算 python解法

    资源限制 内存限制:64.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s 问题描述 给出一个n阶行列式(1<=n<=9),求出 ...

  4. 线性代数行列式计算之元素拆分与凑项法

    线性代数行列式计算之拆分凑项法 声明与简介 线性代数行列式计算之拆项法与凑项法是行列式计算里的小技巧,拆项法是能应用行列式可变成多个行列式的性质,凑项法则是将现有行列式凑成拆项法以便计算最终结果. 拆 ...

  5. 线性代数行列式计算之升阶法

    线性代数行列式计算之升阶法 声明与简介 线性代数行列式计算之升阶法是利用行列式展开式的性质(行列式等于某一行或列乘其对应的代数余子式)在原有的行列式上增加1行或列1和0,增加之后方便消除其它行或列,子 ...

  6. java编程实现行列式计算应用,行列式算法(java)

    public class Arranger { private double[][] arrangerMatrix; private double arrangerResult=1.0; public ...

  7. 用行列式展开计算n阶行列式【c++/递归】

    定理:n阶行列式等于它的任一行(列)的元素与其对应的代数余子式的乘积之和 #include<bits/stdc++.h> using namespace std; #define lint ...

  8. 使用c语言计算3阶行列式

    很多学线性代数的小伙伴在计算3阶行列式的时候总会感到很麻烦,数据量大而且容易看错.我们在知道计算方法后就可以使用c语言写出计算3阶行列式的代码: #include.h> int main() { ...

  9. 使用scheme语言实现n阶行列式值的计算

    利用递归计算代数余子式(的值)的思想通过scheme语言来求算n阶行列式的值. <线性代数>第六版同济大学第1章第5节介绍了行列式按行(列)展开的方法,其中提到: 引理: 一个n阶行列式, ...

  10. OpenCv Java Mat的基本使用-行列式计算(6)

    矩阵在形式上和行列式是一样 的,这两天看Mat,想起之前学历的行列式,那么我们如何求解一个矩阵对应的行列式的求解方法 行列式计算: 最简单的二维的行列式: 哈哈,上面是一个简单的计算的规则,希望你勾起 ...

最新文章

  1. 如何混合编译C语言和C++
  2. Unified Networking Lab 安装使用IOL镜像
  3. 数据结构和算法(Java)-张晨光-专题视频课程
  4. superset可视化-world map
  5. laravel5 centos6.4下的配置体验
  6. CreateProcess error = 2,系统找不到指定的文件
  7. linux提示桌面正在处理文件,linux系统下桌面配置文件.desktop的几个小问题
  8. 新型冠状病毒数据抓取及整理详细流程
  9. 《linux核心应用命令速查》连载十二:top:显示进程
  10. html 好看表格样式,简单但是好看的表格样式
  11. 苹果7pnfc功能门禁卡_苹果手机怎么刷门禁卡?iPhone刷门禁卡的设置方法
  12. 装系统时出现获取硬盘分区失败 可能缺少硬盘驱动怎么办
  13. 第二章 基本放大电路
  14. 关于C++版本的海图渲染引擎MyS57Map
  15. Android adb查看网络连接情况
  16. MAC VScode 强制重启后保存的代码全没了
  17. 游戏3D建模入门,有哪些建模软件可以选择?
  18. 第七篇 indicators(2)指标的绘制
  19. Xcode更新不了的解决办法
  20. Windows下使用Jconsole远程监控Linux系统中java服务器资源占用情况

热门文章

  1. 日常办公,无特殊要求者怎么选择显示器?
  2. 普渡大学的计算机工程,普渡大学(Purdue University)计算机工程专业解读 (2016-03-11 11:27:11)转载▼...
  3. ubuntu 虚拟机设置全屏
  4. 寄存柜程序模拟(C语言)
  5. java不小于等于符号怎么打_java 大于等于号怎么打 java编程里面 x大于
  6. ssh连接阿里云服务器报错 Server responded ”Algori thm negotiation failed.”
  7. 快门光圈感光度口诀_一张图教你看懂相机光圈、快门、感光度!太神了!
  8. OpenLayers 3 入门教程
  9. Go 依赖注入库dig
  10. Kubernetes Pod 健康检查机制 LivenessProbe 与 ReadinessProbe