老笔记整理五:C实现10阶内通过展开代数余子式求行列式的值
Posted shiningsun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了老笔记整理五: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 }
以上是关于老笔记整理五:C实现10阶内通过展开代数余子式求行列式的值的主要内容,如果未能解决你的问题,请参考以下文章