本文是对姜老师讲解的公式法求解行列式的详述,以及非递归的全排列算法的个人转述。

1.公式法

理解行列式公式法的,可以跳过该部分

行列式(determinant)的定义公式如下图所示,截图来源Deternimant-wiki

上图很抽象,不易理解,结合例子看,就更容易了:

这里举的是一个3*3方阵的例子:sgn([a,b,c]),表示对序列[a,b,c]的(-1)逆序次方,比如sgn([1,2,3]),[1,2,3]的逆序数为0,即−10-1^0−10,为1;∏i=1nai[1,2,3]i\prod_{i=1}^n a_i[1,2,3]_i∏i=1n​ai​[1,2,3]i​为连乘,即a11∗a22∗a33a_{11}*a_{22}*a_{33}a11​∗a22​∗a33​,对应等式右边的第一项,后面的以此类推。

可以观察出,3阶方阵有六个项相加,即为1,2,3的全排列,也就是3的阶乘:3!=3∗2∗13!=3*2*13!=3∗2∗1。

因此n阶行列式的求解问题,转换为数字1到n的全排列问题。(代码中,由于数组从0开始,所以用 0到 n-1更合适 )

2.非递归的全排列算法

本算法只能对每个数唯一的集合求全排列

对于3阶及3阶以下的方阵,其全排列很容易列出来,而4阶甚至5阶6阶就太多了,只能通过代码列举。
下面讲详细介绍姜老师讲解的非递归全排列算法,根据其演算过程,我给他起了一个名字:“找大数算法”。
(假定对“0”“1”“2”三个数进行全排列)算法的移动规则如下:
初始顺序从小到大,方向全部向左,即:←←←\leftarrow\leftarrow\leftarrow←←←0120 1 2012最大数“2”可以按照移动方向和“1”交换位置,得到新的序列←←←\leftarrow\leftarrow\leftarrow←←←021021021继续移动,到最左侧,←←←\leftarrow\leftarrow\leftarrow←←←201201201此时,最大数“2”无法再向左移动,则寻找第二大的数“1”,判断能否按其方向移动,若能,则移动并改变最大数“2”的方向,(若不能,则判断“0”,“0”是最小数,无法移动,算法结束),此处明显能移动,得到新序列:→←←\rightarrow\leftarrow\leftarrow→←←210210210重复上面的过程,得到←→←\leftarrow\rightarrow\leftarrow←→←120120120←←→\leftarrow\leftarrow\rightarrow←←→102102102此时“2”,“1”,“0”均无法移动,算法结束。

上面的3阶方阵算法流程以表格展示如下:

步骤 结果 解释
1 012 ←←\leftarrow\leftarrow←←←\leftarrow← 初始序列,方向全部向左
2 021 ←\leftarrow←←\leftarrow←←\leftarrow← 最大数2,左移,2和1交换
3 201 ←\leftarrow←←←\leftarrow\leftarrow←← 最大数2,左移,2和0交换
4 210 →←\rightarrow\leftarrow→←←\leftarrow← 最大数2,位于最左且向左,找次最大1,向左,交换1和0,对最大数2反向
5 120 ←\leftarrow←→\rightarrow→←\leftarrow← 最大数2,右移,2和1交换
6 102 ←←\leftarrow\leftarrow←←→\rightarrow→ 最大数2,右移,2和0交换
7 None 最大数2,最右且向右,次最大1,最左且向左,0最小,无法移动,结束

此时可以验证,3阶的全排列个数正好是6个。

对于4阶,可以推测其全排列个数是4!=4* 3 * 2 *1=24个,如下表所示:

步骤 结果 解释
1 0123 ←←←\leftarrow\leftarrow\leftarrow←←←←\leftarrow← 初始序列,全部向左
2 0132 ←←\leftarrow\leftarrow←←←\leftarrow←←\leftarrow← 最大数3左移
3 0312 ←\leftarrow←←\leftarrow←←←\leftarrow\leftarrow←← 最大数3左移
4 3012 ←\leftarrow←←←←\leftarrow\leftarrow\leftarrow←←← 最大数3左移
5 3021 →\rightarrow→←\leftarrow←←\leftarrow←←\leftarrow← 最大数3最左向左,次最大2左移,3反向
6 0321 ←\leftarrow←→\rightarrow→←←\leftarrow\leftarrow←← 最大数3右移
7 0231 ←←\leftarrow\leftarrow←←→\rightarrow→←\leftarrow← 最大数3右移
8 0213 ←←←\leftarrow\leftarrow\leftarrow←←←→\rightarrow→ 最大数3右移
9 2013 ←\leftarrow←←←\leftarrow\leftarrow←←←\leftarrow← 最大数3最右向右,次最大2左移,3反向
10 2031 ←←\leftarrow\leftarrow←←←\leftarrow←←\leftarrow← 最大数3左移
11 2301 ←\leftarrow←←\leftarrow←←←\leftarrow\leftarrow←← 最大数3左移
12 3201 ←\leftarrow←←←←\leftarrow\leftarrow\leftarrow←←← 最大数3左移
13 3210 →→←\rightarrow\rightarrow\leftarrow→→←←\leftarrow← 最大3最左向左,次最大2向左但无法左移,次次最大1左移,3和2反向
14 2310 →\rightarrow→→\rightarrow→←←\leftarrow\leftarrow←← 最大数3右移
15 2130 →←\rightarrow\leftarrow→←→\rightarrow→←\leftarrow← 最大数3右移
16 2103 →←←\rightarrow\leftarrow\leftarrow→←←→\rightarrow→ 最大数3右移
17 1203 ←\leftarrow←→\rightarrow→←\leftarrow←←\leftarrow← 最大数3最右向右,次最大2向右右移,3反向
18 1230 ←→\leftarrow\rightarrow←→←\leftarrow←←\leftarrow← 最大数3左移
19 1320 ←\leftarrow←←\leftarrow←→←\rightarrow\leftarrow→← 最大数3左移
20 3120 ←\leftarrow←←→←\leftarrow\rightarrow\leftarrow←→← 最大数3左移
21 3102 →\rightarrow→←←\leftarrow\leftarrow←←→\rightarrow→ 最大数3最左向左,次最大2向右右移,3反向
22 1302 ←\leftarrow←→\rightarrow→←→\leftarrow\rightarrow←→ 最大数3右移
23 1032 ←←\leftarrow\leftarrow←←→\rightarrow→→\rightarrow→ 最大数3右移
24 1023 ←←→\leftarrow\leftarrow\rightarrow←←→→\rightarrow→ 最大数3右移
25 None 无法移动,结束

3.结果展示

输入了一个5阶方阵,输出其行列式的值为-571.87863892

在矩阵行列式计算页面里输入上述矩阵:

计算结果如下图:

和算法得到的结果几乎一致

4.核心代码

注意:此处只粘贴了核心逻辑代码,用于辅助理解算法,不能直接复制运行

        //Index arrayprivate int[] indexArray;//Store index's direction: true is left,false is rightprivate bool[] indexArrayLeftDirection;private int biggestIndex = -1;public int BiggestIndex {get { return biggestIndex; }set{//When you set Biggest value,make a Swap!Swap(biggestIndex, value);biggestIndex = value;}}/// <summary>/// Change indexArray.///  If return false,finished!///    Else,not yet!/// </summary>private bool FindBiggest(){//Judge two situations://   1.Biggest in leftmost and direction is left//   2.Biggest in rightmost and direction is rightif ((BiggestIndex == 0 && indexArrayLeftDirection[BiggestIndex] == true) || (BiggestIndex == rank - 1 && indexArrayLeftDirection[BiggestIndex] == false)) {//Find less big index and change direction of biggestint lessNum=2;bool notFind = true;//Change DirectionindexArrayLeftDirection[BiggestIndex] = !indexArrayLeftDirection[BiggestIndex];do{//Finished!!!if (rank - lessNum == 0)return false;for (int i = 0; i < indexArray.Length; i++){//Get less big indexif(indexArray[i]==rank-lessNum){// 1.Less big index is in leftmost and direction is left// 2.Less big index is in rightmost and direction is right// 3.Less big index's direction is left but it's left is biggest,can't move!// 4.Less big index's direction is right but it's right is biggest,can't move!if ((i == 0 && indexArrayLeftDirection[i] == true) ||(i == rank - 1 && indexArrayLeftDirection[i] == false) ||(indexArrayLeftDirection[i] && indexArray[i - 1] > indexArray[i]) ||(!indexArrayLeftDirection[i] && indexArray[i + 1] > indexArray[i])){//Find less less big indexlessNum++;//Change less big index's directionindexArrayLeftDirection[i] = !indexArrayLeftDirection[i];}else{//Find and get less big indexnotFind = false;if (indexArrayLeftDirection[i])Swap(i, i - 1);elseSwap(i, i + 1);}break;}}} while (notFind);}else{if (indexArrayLeftDirection[biggestIndex] == true)BiggestIndex -= 1;elseBiggestIndex += 1;}return true;}/// <summary>/// Swap index and direction/// </summary>private void Swap(int a,int b){int tempIndex = indexArray[a];bool tempDirection = indexArrayLeftDirection[a];indexArray[a] = indexArray[b];indexArrayLeftDirection[a] = indexArrayLeftDirection[b];indexArray[b] = tempIndex;indexArrayLeftDirection[b] = tempDirection;}

求解n阶方阵的行列式相关推荐

  1. 求解n阶方阵零化多项式的mathematica代码

    Remove["`*"]; zeroPolynomial[A_] := Module[{n = Length[A], base, m, s},base = NestList[Dot ...

  2. 任意阶数实数方阵的行列式的值的C语言实现详解

    算法描述 对于一个N阶的方阵,则它的行列式的值为,这里我们引入余子式的概念,在线性代数的课本中它的定义如下:在N阶行列式中,把元素所在的第i行和第j列划去后,留下了的N-1阶行列式叫元素的余子式,记作 ...

  3. 《线性代数:行列式》: n 阶方阵行列式公式

    设 A 为 n 阶方阵 设 n 阶方阵 A 的特征值为 则有 若矩阵 A 和矩阵 B 相似,则行列式相等,即

  4. 用c语言求解n阶线性矩阵方程组,用C语言求解N阶线性矩阵方程Axb简单解法.docx

    用C语言求解N阶线性矩阵方程Axb简单解法 用C语言求解N阶线性矩阵方程Ax=b的简单解法一.描述问题:题目:求解线性方程组Ax=b,写成函数.其中,A为n×n的N阶矩阵,x为需要求解的n元未知数组成 ...

  5. 线性代数——方阵的行列式、伴随矩阵、逆矩阵

    文章目录 方阵的行列式 性质 伴随矩阵 性质 逆矩阵 性质 Numpy中逆矩阵的函数 方阵的行列式 由n阶方阵A的元素所构成的行列式,称为方阵A的行列式,记作|A|. 性质 |AT| = |A| |λ ...

  6. 用c语言求解n阶线性,用C语言求解N阶线性矩阵方程Ax=b的简单解法.docx

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp高等教育&nbsp>&nbsp专业基础教材 用C语言求解N阶线性矩阵方程Ax=b的简单解法. ...

  7. 【094】A是n阶方阵,k是常数,可以证明|kA|等于k的n次方乘以|A|

    如果A是n阶方阵,k是常数,那么 |kA| = Kn|A| 证明: 用 j1, j2, ··· , jn 表示从1到n的序列.根据行列式的定义: |A|= ∑(j1,j2,···,jn)(-1)τ(j ...

  8. 用c语言求解n阶线性矩阵方程组,用C语言求解N阶线性矩阵方程Ax=b的简单解法

    首先,为了能够求解N阶线性方程组(N由用户输入),所以需要定义一个大于N维的数组a[dim+1][dim+1](dim为设定的最大维数,防止计算量溢出),当用户输入的阶数N超过设定值时提示重启程序重新 ...

  9. C 语言求解N阶线性矩阵方程Ax=b,用C语言求解N阶线性矩阵方程Ax=b的简单解法

    首先,为了能够求解N阶线性方程组(N由用户输入),所以需要定义一个大于N维的数组a[dim+1][dim+1](dim为设定的最大维数,防止计算量溢出),当用户输入的阶数N超过设定值时提示重启程序重新 ...

最新文章

  1. Windows环境安装Tomcat
  2. 经营为什么需要哲学(学习总结)
  3. Jquery$和$$的区别
  4. 阻塞非阻塞和同步异步
  5. 华为p20支持手机云闪付吗_华为官宣7款旗舰支持升级EMUI10.132系统,你的手机有份吗?...
  6. 竞赛图 计算机网络 应用题,我校学子获2020年“中国高校计算机大赛-网络技术挑战赛”全国总决赛一等奖(图)...
  7. python读单行文本求平均值_如何从文本文件python中的数字列表中找到平均值
  8. mysql 5.5 5.6 备份库_mysql5.5备份数据库里面除系统库外的所有数据库
  9. tf.layers.conv2d_transpose 反卷积
  10. vs应用程序无法正常启动
  11. Multisim的学习记录(一)
  12. netty 高匿ip检测_检测代理IP匿名程度的方法
  13. 全球高效能人士给青年的50个忠告(上)
  14. 《SteamVR2.2.0快速入门》(Yanlz+Unity+XR+OpenVR+OpenXR+SteamVR+Valve+Vive+Oculus+Quickstart+HMD+立钻哥哥++ok++)
  15. 自定义点击弹出设置百度商桥
  16. 计算机与信息学院迎新标语,学院迎新标语横幅
  17. 123457123456#0#-----com.cym.shuXue02--前拼后广--开心学数学
  18. 写了个自动批改小孩作业的代码~
  19. View 视图解析(Revit二次开发)
  20. 问题:虚拟机中CentOS7不能ping通百度解决心得

热门文章

  1. 怎么让图片铺满手机屏幕_设置ImageView显示的图片铺满全屏
  2. 用c#开发微信 (15) 微活动 1 大转盘
  3. 6-3 工作汇报-有效展现业绩-项目成功与失败时的汇报方式
  4. Linux 进程管理工具:supervisor
  5. 网络显示已连接,但是无网络解决办法
  6. Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
  7. 苹果承认新一代iPad wifi问题 正调查原因
  8. HTML XHTML CS3 JS网页制作(IT培训网站设计+当当网首页设计)
  9. linux find typelinux find用法(转)
  10. 【摘记】心:稻盛和夫的一生嘱托