老笔记整理五:C实现10阶内通过展开代数余子式求行列式的值

这个分为两部分,先是写出了C实现计算三阶行列式,然后过了一段时间突然有了思路才写下了10阶内这段代码。真怀念那段写代码的日子。

一:C实现计算三阶行列式

最近高数课在上线性代数,二阶的还能口算,三阶的有点麻烦,想陆陆续续地把公式都用C来实现。
因为二阶的行列式如果用C来写就是一句话:val=det[0][0]*det[1][1]-det[0][1]*det[1][0];
太简单了这里就不写了,主要写关于三阶的。只要把这个三阶行列式里每一个元素打进去就能算出值来了。
过两天再写余子式的展开。

 1 #include <stdio.h>
 2
 3 void main()
 4 {
 5     int det[3][3]={0};
 6     int i,j,k;
 7     int det_val=0,det_tval=1;
 8
 9 /*------------------- det Input Start -----------------------------------*/
10     for(i=0;i<3;i++)
11     {
12         printf("Give me the row%d (by space): ",i+1);
13         for(j=0;j<3;j++)
14             scanf("%d",&det[i][j]);
15     }
16 /*------------------- det Input End -------------------------------------*/
17
18
19
20 /*------------------- det Calculate Start -------------------------------*/
21     for(i=0;i<3;i++)
22     {
23         k=i;
24         for(j=0;j<3;k++,j++)//  left-up to right-down
25         {
26             if(k==3) k=0;
27             det_tval*=det[k][j];
28         }
29
30         det_val+=det_tval;
31         det_tval=1;
32     }
33
34     for(i=0;i<3;i++)
35     {
36         k=i;
37         for(j=3-1;j>=0;k++,j--)//  right-up to left-down
38         {
39             if(k==3)k=0;
40             det_tval*=det[k][j];
41         }
42
43         det_val-=det_tval;
44         det_tval=1;
45     }
46
47 /*------------------- det Calculate End --------------------------*/
48
49
50 /*------------------- Show det Start ------------------------------------*/
51     printf("\n");
52     for(i=0;i<3;i++)
53     {
54         for(j=0;j<3;j++)
55             printf("%5d",det[i][j]);
56         printf("\n");
57     }
58 /*------------------- Show det End --------------------------------------*/
59     printf("\n\nval=%d\n",det_val);
60 }

二:C实现10阶内通过展开代数余子式求行列式的值

最近越来越忙了,这个问题已经想了有一段时间了。之前发过一篇计算二阶与三阶行列式值的文章,但哪些方法只能解二阶与三阶行列式的值。如果想求高阶的行列式,必需通过代数余子式展开才行。虽然网上看到过有关代码,但我不想细看。还是自己写出来的有成就感。这两个礼拜日思夜想,终找到其规律。

这段代码可以求最高十阶的行列式的值,当然是通过展开代数余子式的方式。这里的关键在于,拿四阶来举例。四阶的行列式展开后是某 行的四个元素分别乘以他们各自的余子式,而每个余子式又继续按照这种样子继续,这是典型的迭代算法。因此我把求余子式的过程写成了一个函数。直到迭代到余子式为二阶行列式时我们再用二阶行列式办法去做。但这还不是这道题的难点。难点在于经过不定次数的迭代后,必定会有个二阶的余子式,这个二阶余子式的几个元素并不是相邻的。如何找对这四个元素才是本题最大的难点。

废话不多说了,上代码,欢迎各位高手来指点。

  1 #include <stdio.h>
  2 #define max 10
  3
  4 void show_minor(int start,int end,int det[max][max]);
  5
  6 void main()
  7 {
  8     int det[10][10]={0};
  9     int i,j,k,n=0;
 10     int *dot=det;
 11     int det_val=0,det_tval=1;
 12
 13     do{
 14         printf("Give me the Order Number between 1 to 9:");
 15         scanf("%d",&n);
 16     }while(n<0||n>9);
 17
 18     for(i=1;i<=n;i++)
 19     {
 20         printf("Give me the row%d (by space): ",i);
 21         for(j=1;j<=n;j++)
 22             scanf("%d",&det[i][j]);
 23     }
 24
 25     det[0][0]=n;
 26
 27     for(i=n+1;i<max;i++)
 28     det[0][i]=det[i][0]=1;
 29
 30
 31     det_val=Minor_In(n,dot);
 32
 33     printf("\n");
 34     show_minor(1,n,dot);
 35
 36     printf("\n\nval=%d\n",det_val);
 37 }
 38
 39
 40 void show_minor(int start,int end,int det[max][max])
 41 {
 42     int i,j;
 43     for(i=start;i<=end;i++)
 44     {
 45         for(j=start;j<=end;j++)
 46             printf("%5d",det[i][j]);
 47         printf("\n");
 48     }
 49
 50 }
 51 int fut2(num){
 52     return 1-num%2*2;
 53     }
 54
 55 int Minor_In(int msize,int det[max][max])
 56 {
 57
 58     int i,j,k=1,Mvalue=0,l=1;
 59     int *md=det;
 60     int m00=1,m01=1,m10=1,m11=1;
 61
 62     if(msize==2)
 63     {
 64         for(i=1;i<=det[0][0];i++)
 65             for(j=1;j<=det[0][0];j++)
 66                 if(!det[i][0] && !det[0][j])
 67                 {
 68                     switch(k)
 69                     {
 70                         case 1:
 71                             m00=det[i][j];break;
 72                         case 2:
 73                             m01=det[i][j];break;
 74                         case 3:
 75                             m10=det[i][j];break;
 76                         case 4:
 77                             m11=det[i][j];break;
 78                         default:break;
 79                     };
 80                     k++;
 81                 }
 82         Mvalue=m00*m11-m01*m10;
 83     }
 84     else
 85     {
 86         k=det[0][0]-msize+1;
 87         det[k][0]=1;
 88
 89         for(i=1;i<=det[0][0];i++)
 90         {
 91             if(!det[0][i])
 92             {
 93                 det[0][i]=1;l*=-1;
 94                 Mvalue+=det[k][i]*l*Minor_In(msize-1,md);
 95                 det[0][i]=0;
 96             }
 97         }
 98         det[k][0]=0;
 99     }
100     return Mvalue;
101 }
时间: 2024-10-01 20:55:51

老笔记整理五:C实现10阶内通过展开代数余子式求行列式的值的相关文章

老笔记整理一:asp

学生时代 主要用的是asp 和 asp.net 笔记也写了不少,现在回头看看有不少不错的代码.现整理后贴出来. 自用函数库: fun.asp 1 Dim mConn,mRs 2 mConn="Driver={Microsoft Access Driver (*.mdb)};DBQ=" & server.MapPath("BBS.mdb") 3 4 public function OpenRs(mSQL) 5 set OpenRs=server.CreateO

老笔记整理二:网页小问题汇总

最近有一些小问题.想在这里写出来.一是方便大家排错,再是自己也整理一下. 1.很傻的小问题...参数提交方式有一个应该是form而不是from.(英语老师,我对不起你...) 2.用超链接传参数,在?后面不能有空格. 3.表单里的东西(如文本域)放完后,记得要改name(名字)和value(数值).否则在后台会报错.通常是fun.asp里 ExcuteRs里mCmd.execute出错. 4.where 语句里字符串一定要加单引号,基本都是' "  &  变量  &  "

老笔记整理四:字符串的完美度

今天在宠果网上发现一道题目,求一个字符串的完美度http://hero.pongo.cn/home/index觉得这道题很有趣就挑战了一下,结果没有在规定的1小时里面写完(笑),多花了10分钟终于做出来了. 题目是这样的:我们要给每个字母配一个1-26之间的整数,具体怎么分配由你决定,但不同字母的完美度不同, 而一个字符串的完美度等于它里面所有字母的完美度之和,且不在乎字母大小写,也就是说字母F和f的完美度是一样的. 现在给定一个字符串,输出它的最大可能的完美度. 例如:dad,你可以将26分配

老笔记整理六:MD5的小作死

MD5为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.是计算机广泛使用的杂凑算法之一. MD5算法具有以下特点: 1.压缩性:任意长度的数据,算出的MD5值长度都是固定的. 2.容易计算:从原数据计算出MD5值很容易. 3.抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别. 4.弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的. 5.强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的

Python学习笔记整理(五)Python中的列表.

列表和字段,这两种类型几乎是Python所有脚本的主要工作组件.他们都可以在原处进行修改,可以按需求增加或缩短,而且包含任何种类的对象或者被嵌套. 一.列表 列表的主要属性: *任意对象的有序集合 从功能上看,列表就是收集其他对象的地方,可以把它看作组.列表所包含每一项都保持了从左到右的位置顺序(它们是序列) *通过偏移读取 和字符串一样,可以通过列表对象的偏移对其进行索引,从而读取对象的某一部分内容.可以自行分片和合并之类的任务. *可变长度,异构以及任意嵌套 列表可以实地增长或者缩短,并且可

老笔记整理七:高斯分布解决随机圆分布问题

好久没有写空间了,今天在写一个页面的时候遇到了之前从来没有遇到过的问题.今天有主要问题有两个.     1.我想在背景上生成随机圆:    2.是基于上面产生的问题. 首先,通过JS生成DIV,给DIV 加DSS让他成为一个圈.这个问题不大,大概半个小时就写出来了. div结构也不复杂 然后运行结果 大家 看出问题了吗?是的,产生的圆不怎么会在当中.想想也是,既然是随即生成的那么应该是平均分布的. 但是这并不是我想要的结果.我之所以要这些圆圈是为了让背景好看点,如果看不到那还有什么意思?但是又不

Deep Learning(深度学习)学习笔记整理系列之(五)

Deep Learning(深度学习)学习笔记整理系列 [email protected] http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04-08 声明: 1)该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的版本声明也参考原文献. 2)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主

Deep Learning(深度学习)学习笔记整理系列五

Deep Learning(深度学习)学习笔记整理系列 声明: 1)该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的版本声明也参考原文献. 2)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除. 3)本人才疏学浅,整理总结的时候难免出错,还望各位前辈不吝指正,谢谢. 4)阅读本文需要机器学习.计算机视觉.神经网络等等基础(如果没有也没关系了,没

从0开始学Swift笔记整理(五)

这是跟在上一篇博文后续内容: --Core Foundation框架 Core Foundation框架是苹果公司提供一套概念来源于Foundation框架,编程接口面向C语言风格的API.虽然在Swift中调用这种C语言风格的API比较麻烦,但是在OS X和iOS开发过程中,有时候使用Core Foundation框架的API是非常方便的,例如在与C语言混合编码的时候. Core Foundation框架与Foundation框架紧密相关,他们具有与相同的接口,但是不同.Core Founda