上一个随笔,我介绍了全排列的递归求解,其中还有排列的逆序数等代码,这次我来介绍如何使用全排列计算行列式的值。

使用全排列求行列式的值,简单的描述就是:

对这个行列式每一行选取一个数,这些数处于行列式的不同的列,将这些数相乘,结果记为A_1

将这些数的列标按行标从上到下的顺序排列,如果这个排列的逆序数为偶数,A_1加个正号+A_1,否则加个负号-A_1

由排列组合知识我们知道我们一共能从行列式中取出n!种情况。他们的和就是行列式的值

(刚开始用博客园,没找到插入latex的地方,我就截个图了。。。)

可见,我们需要实现以下功能:

1. 定义矩阵类

2. 获得矩阵列标的全排列

3. 对每个排列,在矩阵的每一行取一个数,并计算这个排列的逆序数,决定符号

4. 计算取出的数的求积,综合以上操作,求出行列式的值

逐个实现!

1. 首先,类定义的代码分别如下(成员函数逐一介绍):

public classMatrix {/*** author:ZhaoKe

* college: CUST*/

public introw;public intcolumn;public double[][] elements;publicMatrix() {this.elements = new double[this.row][this.column];for (int i = 0; i < this.row; i++) {for (int j = 0; j < this.column; j++) {this.elements[i][j] = 0;

}

}

}public Matrix(double[][] elements) {this.row =elements.length;this.column = elements[0].length;this.elements = new double[this.row][this.column];for (int i = 0; i < this.row; i++) {for (int j = 0; j < this.column; j++) {this.elements[i][j] =elements[i][j];

}

}

}

}

2. 然后我们要获得全排列,这部分上一次已经讲过,完整代码请看一下 https://www.cnblogs.com/zhaoke271828/p/12530031.html

3. 根据排列从矩阵中取数,所谓排列,我们用数组表示,那么功能也很好实现,大家可以自己试一下,注意这是Matrix类的成员函数

public double[] getArrayByColumnIndex(int[] index) {double[] array = new double[index.length];for (int i = 0; i < this.row; i++) {

array[i]= this.elements[i][index[i]];

}returnarray;

}

4. 然后直接求行列式的值:

根据逆序数判断正负号:

this.isOdd(perm.against(result[i]))?1:-1

这个perm表示Permutation类的实例,这个类的定义参考我的另一个博客 全排列的Java实现 https://www.cnblogs.com/zhaoke271828/p/12530031.html

public boolean isOdd(intnumber) {return number %2==0;

}public double det() throwsException {if (this.row != this.column) {throw new Exception("该矩阵不是方阵,不可求行列式,考虑求广义行列式吧!");

}int[] index = new int[this.column];for (int i = 0; i < index.length; i++) {

index[i]=i;

}

Permutation perm= newPermutation(index);

perm.perm(index,0);int[][] result =perm.getResult();double sum = 0;for (int i = 0; i < result.length; i++) {//System.out.println("本次运算的数组:" + Arrays.toString(getArrayByColumnIndex(result[i])));//System.out.println("符号是:" + (this.isOdd(perm.against(result[i]))?1:-1));

sum += Array.prod(getArrayByColumnIndex(result[i]))*(this.isOdd(perm.against(result[i]))?1:-1);

}returnsum;

}

其中涉及到对一个数组求连乘积,这个大家可以自己实现以下,我这里又定义了数组类Array,代码如下:

其实变麻烦了,不过博主习惯这种操作hhhhh~如果还需要关于数组的操作,方便添加功能

public classArray {public double[] elements;public Array(double[] elements) {this.elements =elements;

}public static double prod(double[] array) {double prod = 1;for (int i = 0; i < array.length; i++) {

prod*=array[i];

}returnprod;

}

}

以上就是全部代码了,可以试一下效果:

public static voidmain(String[] args) {double[][] matrix ={

{1, 2, 4, 8},

{1,1,1,1},

{1, 4, 16, 64},

{1,5,25,125}

};

Matrix m= newMatrix(matrix);try{

System.out.println(m.det());

}catch(Exception e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

结果正是  -72.0

行列式java_n阶行列式的全排列求解(Java)相关推荐

  1. java 行列式计算_n阶行列式的全排列求解(Java)

    上一个随笔,我介绍了全排列的递归求解,其中还有排列的逆序数等代码,这次我来介绍如何使用全排列计算行列式的值. 使用全排列求行列式的值,简单的描述就是: 对这个行列式每一行选取一个数,这些数处于行列式的 ...

  2. 四阶行列式直接展开_四阶行列式_4阶行列式详细解题步骤

    求四阶行列式解题过程 完整问题:求四阶行列式解题过程: 好评回答:D=|2 4 4 -3||1 -6 -2 1||-3 5 2 0||4 -12 0 3|第2行的3倍加到第1行,第2行的-3倍加到第4 ...

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

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

  4. TOJ4537: n阶行列式

    4537: n阶行列式  Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByte Total Submit: 28     ...

  5. 线性代数 01.01 n阶行列式的定义

    第一章行列式 \color{blue}{第一章 行列式} 主要介绍n阶行列式的定义.性质及计算方法. 主要介绍n阶行列式的定义.性质及计算方法. 介绍用n阶行列式求解n元线性方程组的克拉默(Crame ...

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

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

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

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

  8. java 计算矩阵行列式_Java 矩阵行列式算法(非高斯消元)

    最近由于项目任务较少,手上有不少空闲的时间,所以抽空研究了一下矩阵行列式的算法. 先来说说行列式,以下摘自百度百科: 行列式在数学中,是由解线性方程组产生的一种算式.行列式的特性可以被概括为一个多次交 ...

  9. 行列式求值的两种方法——Java实现

    基本概念: 行列式是数,矩阵是一个式子!!! 余子式与代数余子式: 余子式:在 n 阶行列式中,把某个元素所在的行列都去掉之后,剩下的 n-1 阶行列式就叫做该元素的余子式: 代数余子式: 基本性质: ...

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

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

最新文章

  1. 2014\Province_C_C++_B\6 奇怪的分式
  2. ES6学习 - Promise对象
  3. 又来Hello World了,Hello Python
  4. r语言去除字符串两端多余空格
  5. row_number()over函数的使用(转)
  6. java二叉树的遍历,递归与非递归方法
  7. #Deep Learning回顾#之2006年的Science Paper
  8. 【微机原理笔记】第 4 章 - 8086 汇编语言程序设计
  9. tuxedo客户端调用java_tuxedo调用客户端_tuxedo调用java socket_调用tuxedo
  10. EMD 加 时频分析
  11. CRC循环冗余校验码原理解析(附实例)
  12. 蓝阔无线打印服务器怎么连接5g,TP-Link TL-WDR7500路由器5G无线WDS桥接设置
  13. (十三)Thread-Specific Storage(ThreadLocal)模式
  14. Vulkan_Shader_Day01—光照(物体颜色)
  15. lumen php命令,lumen添加artisan 命令方法
  16. 【水位预测】基于matlab径向基神经网络地下水位预测【含Matlab源码 1939期】
  17. javaMail 的邮件发送包括了抄送(CC),密送(BCC)采用springBoot
  18. 万字讲解Apollo,全网Apollo资料整理和学习
  19. 磁盘划分空间提示磁盘上没有足够的空间完成此操作,使用傲梅分区助手解决
  20. osl倒数第三层_买房选几楼?专家直言:不管有几层,这“三层”值得买

热门文章

  1. 程序员26条做网站的定律原理和效应
  2. SOPC Builder failed to refresh PTF file
  3. 重复渐变过渡 百分比
  4. Photoshop 2020免注册登录版,自用下载安装教程
  5. 香港中文大学推荐大学期间书单 87本你读过哪些?
  6. 【CPU设计实战】简单流水线CPU设计
  7. 大端与小端的区别 之小端
  8. AtCoder Beginner Contest 269笔记
  9. 树莓派介绍以及FAQ【这是我见过最全的树莓派教程】
  10. web前端设计与开发大作业(一)----黄山风景区