matrixOperations.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include "matrixOperations.h"
  2. void matrix_inverse(float (*a)[N],float (*b)[N])
  3. {
  4. int i,j,k;
  5. float max,temp;
  6. // 定义一个临时矩阵t
  7. float t[N][N];
  8. // 将a矩阵临时存放在矩阵t[n][n]中
  9. for(i=0;i<N;i++)
  10. {
  11. for(j=0;j<N;j++)
  12. {
  13. t[i][j] = a[i][j];
  14. }
  15. }
  16. // 初始化B矩阵为单位矩阵
  17. for(i=0;i<N;i++)
  18. {
  19. for(j=0;j<N;j++)
  20. {
  21. b[i][j] = (i == j)?(float)1:0;
  22. }
  23. }
  24. // 进行列主消元,找到每一列的主元
  25. for(i=0;i<N;i++)
  26. {
  27. max = t[i][i];
  28. // 用于记录每一列中的第几个元素为主元
  29. k = i;
  30. // 寻找每一列中的主元元素
  31. for(j=i+1;j<N;j++)
  32. {
  33. if(fabsf(t[j][i]) > fabsf(max))
  34. {
  35. max = t[j][i];
  36. k = j;
  37. }
  38. }
  39. //cout<<"the max number is "<<max<<endl;
  40. // 如果主元所在的行不是第i行,则进行行交换
  41. if(k != i)
  42. {
  43. // 进行行交换
  44. for(j=0;j<N;j++)
  45. {
  46. temp = t[i][j];
  47. t[i][j] = t[k][j];
  48. t[k][j] = temp;
  49. // 伴随矩阵B也要进行行交换
  50. temp = b[i][j];
  51. b[i][j] = b[k][j];
  52. b[k][j] = temp;
  53. }
  54. }
  55. if(t[i][i] == 0)
  56. {
  57. break;
  58. }
  59. // 获取列主元素
  60. temp = t[i][i];
  61. // 将主元所在的行进行单位化处理
  62. //cout<<"\nthe temp is "<<temp<<endl;
  63. for(j=0;j<N;j++)
  64. {
  65. t[i][j] = t[i][j]/temp;
  66. b[i][j] = b[i][j]/temp;
  67. }
  68. for(j=0;j<N;j++)
  69. {
  70. if(j != i)
  71. {
  72. temp = t[j][i];
  73. //消去该列的其他元素
  74. for(k=0;k<N;k++)
  75. {
  76. t[j][k] = t[j][k] - temp*t[i][k];
  77. b[j][k] = b[j][k] - temp*b[i][k];
  78. }
  79. }
  80. }
  81. }
  82. }