本章主要介绍利用代数余子式计算行列的原理及代码实现

除了代数余子式法,其他计算行列式的方法如下:

1)利用高斯法计算行列式

2)利用LU分解法计算行列式

目录

1.代数余子式计算行列式的原理

二阶行列式计算

三阶行列式计算

按定义计算

2.代码实现

输入矩阵main

行列式的计算Det

余子式Cof

3.该方法的不足


1.代数余子式计算行列式的原理

注意:行列式一定是方阵!

二阶行列式计算

杀戮法:

二阶行列式的计算方法非常简单,主对角线元素相乘—副对角线元素相乘,故又称杀戮法。

三阶行列式计算

划线法:

划线法如下图所示

按定义计算

计算行列式时,可以将其按行或列展开进行计算

以三阶行列式为例:

将行列式A按第一行展开:

其中,Aij为aij的代数余子式(i为行号,j为列号),例如:A11为a11的代数余子式。

 代数余子式的计算方法:

其中,(-1)^(i+j)表示为-1的i+j次方,用来决定代数余子式的正负,Mij为余子式。

余子式:

行列式去其i行j列,剩下的元素组成一个新的行列式,该矩阵为aij的余子式。

例如,a11的余子式为:

去其第一行第一列,剩下的元素按照现有的排列组合成新的行列式。

在计算行列式的值时,我们可以选择0多的那一行和那一列进行展开,大大缩减计算量。

2.代码实现

核心思想:

当我们求高阶行列式的值时,可以利用求代数余子式的方式将求高阶行列式逐步转换为求低阶行列式的问题。利用递归的思想可以解决此类问题,将大事化小,小事化了。

输入矩阵main

在C语言中,矩阵可以利用二维数组数组将其存储起来。

当然用数组存放矩阵也有其缺陷:数组的大小是不可以改变的。在没学动态规划之前,可以根据使用的大小开辟足够大的内存空间,以此来应对该问题。

在输入行列式的时候,还需要确定其阶数n才能进行计算。

#include <stdio.h>
#include <math.h>
#include<assert.h>#define COL 10//为二维数组开辟的最大内存
int main()
{int arr[COL][COL] = { 0 };int i = 0, j = 0;int n = 0;//阶数printf("行列式阶数:>");scanf("%d", &n);printf("请输入行列式:>\n");for (i = 0; i < n; i++){for (j = 0; j < n; j++){scanf("%d", &arr[i][j]);}}printf("%d", Det(arr, n));
}

行列式的计算Det

因为1阶行列式不用计算,就是其本身,而3阶、2阶的行列式又可以根据划线法和杀戮法计算,这里可以将递归的条件设置为n>3,只有四阶及以上的行列式才进行递归,四阶以下的行列式直接计算得出结果。

  • 在行列式计算前,为了保证数组的安全性,在接收数组的时候加上const,保证数组在函数内部无法修改。
  • 行列式的阶数只有大于等于1时才有意义,在函数开头利用assert断言n是否大于0:条件为真函数运行,条件为假assert则会报警告,assert需包含头文件。
int Cof(const int arr2[COL][COL], int i, int n);//声明:计算行列式//计算行列式
int Det(const int arr[COL][COL], int n)
{assert(n > 0);int sum = 0;int i = 0;if (n == 1)//1阶行列式直接得出结果{sum = arr[0][0];}else if (n == 2){sum = arr[0][0] * arr[1][1] - arr[0][1] * arr[1][0];//杀戮法求解}else if (n == 3){sum = arr[0][0] * arr[1][1] * arr[2][2]+ arr[0][1] * arr[1][2] * arr[2][0]+ arr[1][0] * arr[2][1] * arr[0][2]- arr[0][2] * arr[1][1] * arr[2][0]- arr[0][1] * arr[1][0] * arr[2][2]- arr[1][2] * arr[2][1] * arr[0][0];//划线法求解}else{for (i = 0; i < n; i++)//按第一行展开{if (arr[0][i] != 0)//展开项不为0才计算{sum += ((int)pow(-1, i + 2)) * arr[0][i] * (Cof(arr, i, n));//2阶以上继续递归        }elsesum += 0;//展开项为0}}return sum;
}

余子式Cof

接收Det函数传过来的二维数组,取其行列,剩下的元素组成新的二维数组再传给Det函数。两个函数相互调用,直到阶数小于4。

int Det(const int arr[COL][COL], int n);//声明:计算代数余子式//找到余子式
int Cof(const int arr[COL][COL], int i, int n)
{assert(n > 0);int k = 0;int j = 0;int arr2[COL][COL] = { 0 };for (k = 0; k < n - 1; k++)//去除0行i列,剩下的组成新的矩阵{for (j = 0; j < n - 1; j++){if (j < i){arr2[k][j] = arr[k + 1][j];}else{arr2[k][j] = arr[k + 1][j + 1];}}}return Det(arr2, n - 1);
}

3.该方法的不足

尽管我们设置了很多方法来避免无用的递归

  • 展开项为0则不进行计算
  • 3阶以下行列式直接计算

但是如果求高阶的行列式还是有所不足:假如求10阶行列式,则需要递归10!/  6=604,800次,深度递归最终导致程序运行的非常缓慢。

C语言用代数余子式计算行列式相关推荐

  1. c语言编写程序计算行列式值,求行列式的值,用C语言怎么写啊? 如何求行列式的值...

    导航:网站首页 > 求行列式的值,用C语言怎么写啊? 如何求行列式的值 求行列式的值,用C语言怎么写啊? 如何求行列式的值 相关问题: 匿名网友: 行列式计算公式知道吧,给你个源码参考,大一时写 ...

  2. 递归 代数余子式计算行列式 逆矩阵的运算

    上个星期,我们的线性代数老师让我们编程计算行列式,这个星期又让我们算逆矩阵 虽然这个老师上课老爱吹水,但是至少让我们编的程序是可行的 根据某定理:n阶行列式等于它的任一行的元素与其对应的代数余子式的乘 ...

  3. c语言编写程序计算行列式值,新手作品:行列式计算C语言版

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 对话     ControlHeightDecrease     Shift+Up Arrow     向上调整选定的控件或对话一个对话单位 对话     ...

  4. C语言计算行列式以及代数余子式的函数

    C语言计算行列式以及代数余子式的函数 #include<stdio.h> #define N 50 double algebraic_cofactor(double P[N][N],int ...

  5. 线性代数行列式的计算方法(通过代数余子式计算)

    permutation.h /***********************************/ /* Nonstandard Permutation header Copyright (C) ...

  6. C++计算行列式(函数)

    C++计算行列式 思路: 用二维数组存放行列式,然后将首地址传入函数,通过递归不断储存第一列的代数余子式,直到传入的是一个2*2的数组首地址 目前阶段,我仅仅知道,在计算机中,二维数组名的本质类似一维 ...

  7. 四阶代数余子式怎么求_老笔记整理五:C实现10阶内通过展开代数余子式求行列式的值...

    这个分为两部分,先是写出了C实现计算三阶行列式,然后过了一段时间突然有了思路才写下了10阶内这段代码.真怀念那段写代码的日子. 一:C实现计算三阶行列式 最近高数课在上线性代数,二阶的还能口算,三阶的 ...

  8. R语言sd函数计算数值标准差实战(Standard Deviation)

    R语言sd函数计算数值标准差实战(Standard Deviation) 目录 R语言sd函数计算数值标准差实战(Standard Deviation) #基本语法 #sd

  9. R语言自定义函数计算dataframe每列中的缺失值NA的个数、缺失值问题及其填充示例

    R语言自定义函数计算dataframe每列中的缺失值NA的个数.缺失值问题及其填充示例 目录

最新文章

  1. 温故而知新-面向对象的PHP
  2. Mathematica笔记
  3. 关闭Eclipse光标悬浮自动提示
  4. React开发(129):ant design学习指南之form中的layout
  5. 设计一个具有大纯时延时间的一阶惯性环节的计算机控制系统,具有一阶纯滞后环节设计.doc...
  6. weblogic请求服务端超时后重发一次请求_记一次后端服务偶发502的排错之旅
  7. Session何时创建实例
  8. 过滤DataTable中的指定字段重复的行
  9. EM最大期望算法与jensen不等式
  10. JAVA基础语法:java编程规范和常用数据类型
  11. 压缩qcow2虚拟机镜像文件
  12. layui iframe弹出层高度自适应,并垂直居中
  13. 计算机视觉隐私安全,震惊:用手机拍照也可以暴露大量个人隐私
  14. 使用PIXI制作简单canvas逐帧动画的心得
  15. 常见bat命令(二)
  16. OneZero第二周第三次站立会议(2016.3.30)
  17. 在ios中,input唤出软键盘中‘换行’转‘搜索’、‘前往’,及直接唤醒数字键盘的实现(vue)
  18. 计算机无法启动 主板,主板故障导致电脑无法启动的原因以及解决方法!
  19. Java爬虫实践:Jsoup+HttpUnit爬取今日头条、网易、搜狐、凤凰新闻
  20. M1卡修改各区块控制位值和数据

热门文章

  1. 三线性注意力采样网络——用于细粒度图像识别
  2. 机制设计专栏(3)-组合拍卖简介
  3. JPA常用注解详细讲解
  4. 51 jQuery-使用slideDown()与slideUp()方法实现滑动效果
  5. php和Apache安装配置
  6. spark学习之并行度、并发、core数和分区的关系
  7. php程序员进阶过程,PHP程序员有前途的两条进阶路线
  8. Linux文件/目录高级管理一(中级难度)
  9. java中CTSectPr_java使用POI操作XWPFDocument 生成Word实战(一)
  10. chuangkouneihan