经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
三元组矩阵行列式的计算(用递归)
来源:cnblogs  作者:OrdinaryMan  时间:2018/11/25 20:02:57  对本文有异议

1.具体思想:

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

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

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

 

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

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

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

2.三元组和二维数组

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

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

三元组的数据结构如下:

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

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

  1. 1 //计算矩阵行列式
  2. 2 int DatMat(TSMatrix t){
  3. 3 if(t.cols!=t.rows){
  4. 4 printf("该矩阵无法求行列式!");
  5. 5 return 0;
  6. 6 }
  7. 7 else{
  8. 8 int n=t.cols;
  9. 9 int a[n][n];
  10. 10 //将三元组转化为二维数组
  11. 11 for(int i=0;i<n;i++){
  12. 12 for(int j=0;j<n;j++){
  13. 13 a[i][j]=0;
  14. 14 }
  15. 15 }
  16. 16 for(int k=0;k<t.nums;k++){
  17. 17 int i = t.data[k].r;
  18. 18 int j = t.data[k].c;
  19. 19 a[i][j] = t.data[k].d;
  20. 20 }
  21. 21 if (n == 1){
  22. 22 return a[0][0];
  23. 23 }
  24. 24 else{
  25. 25 int b[n-1][n-1];//创建n-1阶的代数余子式阵bb
  26. 26 int c[(n-1)*(n-1)];
  27. 27 int sum = 0;//sum为行列式的值
  28. 28 TSMatrix t1;
  29. 29
  30. 30 //以第一列为基础,求行列式
  31. 31 for(int l=0;l<n;l++){
  32. 32 int m1=0;
  33. 33 int m2=0;
  34. 34 for(int i =0;i<n;i++){
  35. 35 for(int j=0;j<n;j++){
  36. 36 if(i!=l&&j!=0){
  37. 37 c[m1]=a[i][j];
  38. 38 m1++;
  39. 39 }
  40. 40 }
  41. 41 }
  42. 42 for(int i =0;i<n-1;i++){
  43. 43 for(int j=0;j<n-1;j++){
  44. 44 b[i][j]=c[m2];
  45. 45 m2++;
  46. 46 }
  47. 47 }
  48. 48
  49. 49 //把二维数组转化为三元组
  50. 50 t1.rows=n-1;
  51. 51 t1.cols=n-1;
  52. 52 t1.nums=0;
  53. 53 for(int i=0;i<n-1;i++){
  54. 54 for(int j=0;j<n-1;j++){
  55. 55 if(b[i][j]!=0){
  56. 56 t1.data[t1.nums].r=i;
  57. 57 t1.data[t1.nums].c=j;
  58. 58 t1.data[t1.nums].d=b[i][j];
  59. 59 t1.nums++;
  60. 60 }
  61. 61 }
  62. 62 }
  63. 63 sum+=a[l][0]*DatMat(t1)*pow(-1,l);//通过递归来求行列式的值
  64. 64 }
  65. 65 return sum;
  66. 66 }
  67. 67 }
  68. 68 }

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号