老笔记整理五: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阶内通过展开代数余子式求行列式的值的主要内容,如果未能解决你的问题,请参考以下文章

线性代数笔记

行列式02---余子式与代数余子式——行列式按一行(列)展开

行列式按行(列)展开

行列式按行(列)展开

求一个矩阵的逆矩阵(用伴随矩阵求)

P18 行列式公式及代数余子式线性代数