老筆記整理五:C實現10階內通過展開代數余子式求行列式的值
阿新 • • 發佈:2017-07-07
實現 num 每一個 oid -1 如何 calc 上線 inpu
這個分為兩部分,先是寫出了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階內通過展開代數余子式求行列式的值