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

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

对这个行列式每一行选取一个数,这些数处于行列式的不同的列,将这些数相乘,结果记为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. 使用c语言计算3阶行列式

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

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

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

  3. 四阶行列式计算python_四阶行列式的计算题?

    展开全部 高阶的行列式基本不会人工计算,通常借助电脑程序62616964757a686964616fe78988e69d8331333433643131 以该题为例,Python中的命令是 impor ...

  4. 四阶行列式计算_四阶行列式的计算

    四阶行列式要比三阶行列式复杂得多,是真正意义的高阶行列式.求四阶行列式的方法有很多,可以直接用展开公式:也可以化四阶行列式为上三角行列式:可以把行列式某行或者列尽可能的多化出零,然后按这一行或列展开. ...

  5. c语言程序计算4阶行列式的值,如何用降阶法求解四阶行列式的计算,请帮我编一个C语言程序。...

    满意答案 obormyl.cn 推荐于 2016.12.02 采纳率:59%    等级:11 已帮助:8395人 It's easy!I have writed a N-demonstration ...

  6. java惰性计算原理_利用 Lambda 表达式实现 Java 中的惰性求值

    Java 中惰性求值的潜能,完全被忽视了(在语言层面上,它仅被用来实现 短路求值 ).更先进的语言,如 Scala,区分了传值调用与传名调用,或者引入了 lazy 这样的关键字. 尽管 Java 8 ...

  7. 全排列的java算法_两种常用的全排列算法(java)

    问题:给出一个字符串,输出所有可能的排列. 全排列有多种算法,此处仅介绍常用的两种:字典序法和递归法. 1.字典序法: 如何计算字符串的下一个排列了?来考虑"926520"这个字符 ...

  8. java为学生s1的age属性_求解java程序,题目如下

    慕冬雪 public class Student { protected int id; protected String name; protected int age; public Studen ...

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

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

最新文章

  1. mysql 存储地理信息_使用Amazon Aurora存储和处理地理信息数据
  2. 为C# Windows服务添加安装程序
  3. New directions in automated traffic analysis论文解读
  4. 设计灵感|如何让你的海报更吸睛?
  5. 颠覆游戏开发,引领行业革命,从 Unite 2019 看 Unity 技术亮点
  6. Android的 EditText的inputType类型
  7. 有趣的算法(七):3分钟看懂希尔排序(C语言实现)
  8. 端口目录Linux操作系统常用命令
  9. 计算机二级与c语言有什么关系,计算机二级c和c++区别?
  10. 自然电位测井 基本原理、测量方法、曲线规律、曲线用途
  11. 关于区块链你了解多少,用思维导图带你快速了解区块链
  12. linux进程假死的原因_linux下程序假死
  13. 用html5 js实现浏览器全屏
  14. 10个人用的云服务器要什么配置文件,10个人用的云服务器要什么配置文件
  15. 近红外超扫描 | 群际冲突会影响脑间同步
  16. 关于Zion真实性问题的图文分析及其他 V1.06
  17. 高德地图加载多个围栏、行政区查询方法
  18. 基于SpringBoot+layui研发的后台管理平台
  19. H3CSE路由-IPv6过渡技术
  20. Uedit32比较2个文件的内容

热门文章

  1. qml----Model/View入门(四)XmlListModel
  2. se.arch.php,arch暴涨,数据库差点挂。请教
  3. 因子分解机(FM)家族
  4. 【Pandas】返回 视图 还是 副本?SettingwithCopyWarning 的原理和解决方案(摘录转载)
  5. “昆明城市咖啡地图”活动再度开启
  6. OneDrivet账号怎么解封
  7. 服务器证书已过期,WebSphere应用服务器证书过期问题解决
  8. AS3使用,播放声音和加载外部声音文件
  9. c语言程序中要用到阶乘,C程序使用递归求数字的阶乘
  10. PyQt5的一些组件的介绍