1. 程式人生 > >老筆記整理五:C實現10階內通過展開代數余子式求行列式的值

老筆記整理五:C實現10階內通過展開代數余子式求行列式的值

實現 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階內通過展開代數余子式求行列式的值