• 算法与数据结构(二)三元组矩阵行列式的计算(用递归)


    1.具体思想:

    关于计算矩阵行列式有两个主要方法:

    1.根据矩阵行列式的定义式用递归计算(就是本文所讲)

    2.先做矩阵行变换,转化为上三角矩阵,再求行列式。

    (我先是思考了行变换转化为三角矩阵,但中途遇到了些问题,所以先把递归的方法写下来,之后会继续更新另外一种方法。)

    线性代数里我们已经了解了递归求矩阵行列式的方法。下图:

    然后每一个代数余子式又可以看做相对于“n阶母矩阵”的“n-1阶子矩阵”,再次对这个子矩阵按照行或列展开,这就是递归求矩阵行列式的思想。

    2.三元组和二维数组

    二维数组不用多说,它和矩阵是一一对应的,表示完全相同。

    三元组是指形如((r,c),d)的集合,我们规定(r,c)是三元组中的一个数在二维数组中的对应位置,d表示数据的值。

    三元组的数据结构如下:

     1 typedef struct
     2 {
     3     int r;
     4     int c;
     5     int d;
     6 }TupNode;
     7 typedef struct
     8 {
     9     int rows;
    10     int cols;
    11     int nums;
    12     TupNode data[Maxsize];
    13 }TSMatrix;

    具体的计算行列式代码如下:

     1 //计算矩阵行列式
     2 int DatMat(TSMatrix t){
     3     if(t.cols!=t.rows){
     4         printf("该矩阵无法求行列式!");
     5         return 0; 
     6     }
     7     else{
     8         int n=t.cols;
     9         int a[n][n];
    10         //将三元组转化为二维数组 
    11         for(int i=0;i<n;i++){
    12             for(int j=0;j<n;j++){
    13                 a[i][j]=0;
    14             }
    15         }
    16         for(int k=0;k<t.nums;k++){
    17             int i = t.data[k].r;
    18             int j = t.data[k].c;
    19             a[i][j] = t.data[k].d;
    20         }
    21         if (n == 1){
    22             return a[0][0];
    23         }
    24         else{
    25             int b[n-1][n-1];//创建n-1阶的代数余子式阵bb 
    26             int c[(n-1)*(n-1)];  
    27             int sum = 0;//sum为行列式的值 
    28             TSMatrix t1;
    29             
    30             //以第一列为基础,求行列式 
    31             for(int l=0;l<n;l++){
    32                 int m1=0;
    33                 int m2=0; 
    34                 for(int i =0;i<n;i++){
    35                     for(int j=0;j<n;j++){
    36                         if(i!=l&&j!=0){
    37                             c[m1]=a[i][j];
    38                             m1++;
    39                         }
    40                     }
    41                 }
    42                 for(int i =0;i<n-1;i++){
    43                     for(int j=0;j<n-1;j++){
    44                         b[i][j]=c[m2];
    45                         m2++;
    46                     } 
    47                 }
    48                 
    49                 //把二维数组转化为三元组 
    50                 t1.rows=n-1;
    51                 t1.cols=n-1;
    52                 t1.nums=0;
    53                 for(int i=0;i<n-1;i++){
    54                     for(int j=0;j<n-1;j++){
    55                         if(b[i][j]!=0){
    56                             t1.data[t1.nums].r=i;
    57                             t1.data[t1.nums].c=j;
    58                             t1.data[t1.nums].d=b[i][j];
    59                             t1.nums++;
    60                         }     
    61                     }
    62                 }
    63                 sum+=a[l][0]*DatMat(t1)*pow(-1,l);//通过递归来求行列式的值 
    64             }
    65             return sum;
    66         }
    67     }
    68 } 
  • 相关阅读:
    转------深入理解--Java按值传递和按引用传递
    排序算法 -------未完待续
    eclipse智能提示报错(to avoid the message, disable the...)
    关于hashcode 和 equals 的内容总结
    随笔 软件设计师 -----------考后总结
    wpf 中用 C# 代码创建 PropertyPath ,以对间接目标进行 Storyboard 动画.
    AvaloniaUI体验
    wpf 通过为DataGrid所绑定的数据源类型的属性设置Attribute改变DataGrid自动生成列的顺序
    wpf 在不同DPI下如何在DrawingVisual中画出清晰的图形
    基于libcurl实现REST风格http/https的get和post
  • 原文地址:https://www.cnblogs.com/OrdinaryMan/p/10022255.html
Copyright © 2020-2023  润新知