行列式java_n阶行列式的全排列求解(Java)
上一个随笔,我介绍了全排列的递归求解,其中还有排列的逆序数等代码,这次我来介绍如何使用全排列计算行列式的值。
使用全排列求行列式的值,简单的描述就是:
对这个行列式每一行选取一个数,这些数处于行列式的不同的列,将这些数相乘,结果记为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)相关推荐
- java 行列式计算_n阶行列式的全排列求解(Java)
上一个随笔,我介绍了全排列的递归求解,其中还有排列的逆序数等代码,这次我来介绍如何使用全排列计算行列式的值. 使用全排列求行列式的值,简单的描述就是: 对这个行列式每一行选取一个数,这些数处于行列式的 ...
- 四阶行列式直接展开_四阶行列式_4阶行列式详细解题步骤
求四阶行列式解题过程 完整问题:求四阶行列式解题过程: 好评回答:D=|2 4 4 -3||1 -6 -2 1||-3 5 2 0||4 -12 0 3|第2行的3倍加到第1行,第2行的-3倍加到第4 ...
- C语言展开法和全排列法实现n阶行列式计算
在这里向大家介绍两种实现n阶行列式计算的方法 目录 1.展开法 2.全排列法 一.展开法: 展开法的实现思想就是利用递归不断将行列式某一行或者某一列的n-1个(假设行列式为n行n列)置为0,剩余一个置 ...
- TOJ4537: n阶行列式
4537: n阶行列式 Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByte Total Submit: 28 ...
- 线性代数 01.01 n阶行列式的定义
第一章行列式 \color{blue}{第一章 行列式} 主要介绍n阶行列式的定义.性质及计算方法. 主要介绍n阶行列式的定义.性质及计算方法. 介绍用n阶行列式求解n元线性方程组的克拉默(Crame ...
- n阶行列式计算----c语言实现(完结)
花了半天时间,写了这个n阶行列式计算的程序,应该算是比较优美吧,有很多地方多次做了优化,程序占用内存不是很大,要是说小吧,也不合适,因为里边有一个递归,而且递归的深度还比较深.时间复杂度具体没有细看, ...
- 蓝桥杯 算法训练 ALGO-932低阶行列式计算 python解法
资源限制 内存限制:64.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 给出一个n阶行列式(1<=n<=9),求出 ...
- java 计算矩阵行列式_Java 矩阵行列式算法(非高斯消元)
最近由于项目任务较少,手上有不少空闲的时间,所以抽空研究了一下矩阵行列式的算法. 先来说说行列式,以下摘自百度百科: 行列式在数学中,是由解线性方程组产生的一种算式.行列式的特性可以被概括为一个多次交 ...
- 行列式求值的两种方法——Java实现
基本概念: 行列式是数,矩阵是一个式子!!! 余子式与代数余子式: 余子式:在 n 阶行列式中,把某个元素所在的行列都去掉之后,剩下的 n-1 阶行列式就叫做该元素的余子式: 代数余子式: 基本性质: ...
- 用行列式展开计算n阶行列式【c++/递归】
定理:n阶行列式等于它的任一行(列)的元素与其对应的代数余子式的乘积之和 #include<bits/stdc++.h> using namespace std; #define lint ...
最新文章
- 2014\Province_C_C++_B\6 奇怪的分式
- ES6学习 - Promise对象
- 又来Hello World了,Hello Python
- r语言去除字符串两端多余空格
- row_number()over函数的使用(转)
- java二叉树的遍历,递归与非递归方法
- #Deep Learning回顾#之2006年的Science Paper
- 【微机原理笔记】第 4 章 - 8086 汇编语言程序设计
- tuxedo客户端调用java_tuxedo调用客户端_tuxedo调用java socket_调用tuxedo
- EMD 加 时频分析
- CRC循环冗余校验码原理解析(附实例)
- 蓝阔无线打印服务器怎么连接5g,TP-Link TL-WDR7500路由器5G无线WDS桥接设置
- (十三)Thread-Specific Storage(ThreadLocal)模式
- Vulkan_Shader_Day01—光照(物体颜色)
- lumen php命令,lumen添加artisan 命令方法
- 【水位预测】基于matlab径向基神经网络地下水位预测【含Matlab源码 1939期】
- javaMail 的邮件发送包括了抄送(CC),密送(BCC)采用springBoot
- 万字讲解Apollo,全网Apollo资料整理和学习
- 磁盘划分空间提示磁盘上没有足够的空间完成此操作,使用傲梅分区助手解决
- osl倒数第三层_买房选几楼?专家直言:不管有几层,这“三层”值得买