matrix.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include "matrix.h"
  2. int Matrix_Inv_3D(const float P[3][3], float inv[3][3]) {
  3. /* 计算行列式 */
  4. float det = P[0][0] * (P[1][1] * P[2][2] - P[2][1] * P[1][2]) -
  5. P[0][1] * (P[1][0] * P[2][2] - P[1][2] * P[2][0]) +
  6. P[0][2] * (P[1][0] * P[2][1] - P[1][1] * P[2][0]);
  7. if (fabs((float)det) < FLT_EPSILON || !isfinite(det)) {
  8. return -1;
  9. }
  10. inv[0][0] = (P[1][1] * P[2][2] - P[2][1] * P[1][2]) / det;
  11. inv[0][1] = (P[0][2] * P[2][1] - P[0][1] * P[2][2]) / det;
  12. inv[0][2] = (P[0][1] * P[1][2] - P[0][2] * P[1][1]) / det;
  13. inv[1][0] = (P[1][2] * P[2][0] - P[1][0] * P[2][2]) / det;
  14. inv[1][1] = (P[0][0] * P[2][2] - P[0][2] * P[2][0]) / det;
  15. inv[1][2] = (P[1][0] * P[0][2] - P[0][0] * P[1][2]) / det;
  16. inv[2][0] = (P[1][0] * P[2][1] - P[2][0] * P[1][1]) / det;
  17. inv[2][1] = (P[2][0] * P[0][1] - P[0][0] * P[2][1]) / det;
  18. inv[2][2] = (P[0][0] * P[1][1] - P[1][0] * P[0][1]) / det;
  19. return 0;
  20. }
  21. int Matrix_Brinv(float *a, int n) {
  22. int *is, *js, i, j, k, l, u, v;
  23. int temp1[n];
  24. int temp2[n];
  25. float d, p;
  26. is = temp1;
  27. js = temp2;
  28. for (k = 0; k <= n - 1; k++) {
  29. d = 0.0f;
  30. for (i = k; i <= n - 1; i++) {
  31. for (j = k; j <= n - 1; j++) {
  32. l = i * n + j;
  33. p = fabsf(a[l]);
  34. if (p > d) {
  35. d = p;
  36. is[k] = i;
  37. js[k] = j;
  38. }
  39. }
  40. }
  41. if (d + 1.0f == 1.0f) {
  42. return (0);
  43. }
  44. if (is[k] != k) {
  45. for (j = 0; j <= n - 1; j++) {
  46. u = k * n + j;
  47. v = is[k] * n + j;
  48. p = a[u];
  49. a[u] = a[v];
  50. a[v] = p;
  51. }
  52. }
  53. if (js[k] != k) {
  54. for (i = 0; i <= n - 1; i++) {
  55. u = i * n + k;
  56. v = i * n + js[k];
  57. p = a[u];
  58. a[u] = a[v];
  59. a[v] = p;
  60. }
  61. }
  62. l = k * n + k;
  63. a[l] = 1.0f / a[l];
  64. for (j = 0; j <= n - 1; j++) {
  65. if (j != k) {
  66. u = k * n + j;
  67. a[u] = a[u] * a[l];
  68. }
  69. }
  70. for (i = 0; i <= n - 1; i++) {
  71. if (i != k) {
  72. for (j = 0; j <= n - 1; j++)
  73. if (j != k) {
  74. u = i * n + j;
  75. a[u] = a[u] - a[i * n + k] * a[k * n + j];
  76. }
  77. }
  78. }
  79. for (i = 0; i <= n - 1; i++) {
  80. if (i != k) {
  81. u = i * n + k;
  82. a[u] = -a[u] * a[l];
  83. }
  84. }
  85. }
  86. for (k = n - 1; k >= 0; k--) {
  87. if (js[k] != k) {
  88. for (j = 0; j <= n - 1; j++) {
  89. u = k * n + j;
  90. v = js[k] * n + j;
  91. p = a[u];
  92. a[u] = a[v];
  93. a[v] = p;
  94. }
  95. }
  96. if (is[k] != k) {
  97. for (i = 0; i <= n - 1; i++) {
  98. u = i * n + k;
  99. v = i * n + is[k];
  100. p = a[u];
  101. a[u] = a[v];
  102. a[v] = p;
  103. }
  104. }
  105. }
  106. return (1);
  107. }