Advertisement
Guest User

Untitled

a guest
Dec 5th, 2019
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.83 KB | None | 0 0
  1. float det(float **data, unsigned int rc) {
  2. float deter = 0.0, z = 1.0;
  3. float ** dat = malloc(sizeof(*dat) * rc);
  4. for(int h = 0; h < rc; h++) {
  5. dat[h] = malloc(sizeof(dat) * rc); //line 248
  6. }
  7. int a, b, c, x, y;
  8. if(rc == 1) {
  9. return data[0][0];
  10. }
  11. else {
  12. deter = 0;
  13. for(a = 0; a < rc; a++) {
  14. x = 0;
  15. y = 0;
  16. for(b = 0; b < rc; b++) {
  17. for(c = 0; c < rc; c++) {
  18. dat[b][c] = 0;
  19. if((b != 0) && (c != a)) {
  20. dat[x][y] = data[b][c];
  21. if(y < (rc - 2)) {
  22. y++;
  23. }
  24. else {
  25. y = 0;
  26. x++;
  27. }
  28. }
  29. }
  30. }
  31. deter = deter + z * (data[0][a] * det(dat, rc - 1));
  32. z = -1 * z;
  33. }
  34. }
  35. for(int n = 0; n < rc; n++)
  36. free(dat[n]);
  37. free(dat);
  38. return deter;
  39. }
  40.  
  41. int power(int x, int y) {
  42. if (y == 0)
  43. return 1;
  44. else if (y%2 == 0)
  45. return power(x, y/2)*power(x, y/2);
  46. else
  47. return x*power(x, y/2)*power(x, y/2);
  48. }
  49. float** trans(float** data2, float** data3, int r, float dee) {
  50. //float d;
  51. float** inv = malloc(sizeof(*inv) * r);
  52. float** tra = malloc(sizeof(*tra) * r);
  53. for(int i = 0; i < r; i++) {
  54. inv[i] = malloc(sizeof(inv) * r);
  55. tra[i] = malloc(sizeof(tra) * r);
  56. }
  57. int a, b;
  58. for(a = 0; a < r; a++) {
  59. for(b = 0; b < r; b++) {
  60. tra[a][b] = data3[b][a];
  61. }
  62. }
  63. //d = det(data2, r);
  64. //printf("det - %f\n", d);
  65. for(a = 0; a < r; a++) {
  66. for(b = 0; b < r; b++) {
  67. inv[a][b] = tra[a][b]/dee;
  68. }
  69. }
  70. for(int m = 0; m < r; m++)
  71. free(tra[m]);
  72. free(tra);
  73. return inv;
  74. }
  75. float** getCofactor(float **data, int rc) {
  76. float **data2 = malloc(sizeof(*data2) * rc);
  77. float **data3 = malloc(sizeof(*data3) * rc);
  78. for(int i = 0; i < rc; i++) {
  79. data2[i] = malloc(sizeof(data2) * rc);
  80. data3[i] = malloc(sizeof(data3) * rc);
  81. }
  82. int a, b, c, d, x, y;
  83. for(c = 0; c < rc; c++) {
  84. for(d = 0; d < rc; d++) {
  85. x = 0;
  86. y = 0;
  87. for(a = 0; a < rc; a++) {
  88. for(b = 0; b < rc; b++) {
  89. if(a != c && b != d) {
  90. data2[x][y] = data[a][b];
  91. if(y < (rc - 2))
  92. y++;
  93. else {
  94. y = 0;
  95. x++;
  96. }
  97. }
  98. }
  99. }
  100. data3[c][d] = power(-1, c+d) * det(data2, rc - 1);
  101. }
  102. }
  103. float dee = det(data, rc);
  104. float **data4 = trans(data2, data3, rc, dee);
  105. for(int l = 0; l < rc; l++) {
  106. free(data2[l]);
  107. free(data3[l]);
  108. free(data[l]);
  109. }
  110. free(data2);
  111. free(data3);
  112. free(data);
  113. return data4;
  114. }
  115.  
  116.  
  117.  
  118.  
  119. matrix* get_inverse_matrix(matrix* matrix_to_invert)
  120. {
  121. if(matrix_to_invert -> nrows != matrix_to_invert -> ncols) {
  122. //printf("1");
  123. return NULL;
  124. }
  125. if(matrix_to_invert == NULL) {
  126. //printf("2");
  127. return NULL;
  128. }
  129. float deter = det(matrix_to_invert -> data, matrix_to_invert -> nrows);
  130. if(deter == 0) {
  131. return NULL;
  132. }
  133. matrix *mat = malloc(sizeof(matrix));
  134. mat -> nrows = matrix_to_invert -> nrows;
  135. mat -> ncols = matrix_to_invert -> ncols;
  136. mat -> data = getCofactor(matrix_to_invert -> data, matrix_to_invert -> nrows);
  137.  
  138. return mat;
  139. }
  140.  
  141.  
  142. int main() {
  143. //matrix * matria = load_matrix_from_file("sample.bin");
  144. //printf("%u\n", matria -> nrows);
  145. //print_matrix(matria);
  146. matrix *mate = malloc(sizeof(matrix));
  147. mate -> nrows = 4;
  148. mate -> ncols = 4;
  149. float ** data = malloc(sizeof(*data) * 4);
  150. for(int i = 0; i < 4; i++)
  151. data[i] = malloc(sizeof(data) * 4);
  152. data[0][0] = 1;
  153. data[0][1] = 2;
  154. data[0][2] = 3;
  155. data[0][3] = 4;
  156. data[1][0] = 1;
  157. data[1][1] = 2;
  158. data[1][2] = 3;
  159. data[1][3] = 6;
  160. data[2][0] = 2;
  161. data[2][1] = 4;
  162. data[2][2] = 8;
  163. data[2][3] = 0;
  164. data[3][0] = 5;
  165. data[3][1] = 6;
  166. data[3][2] = 7;
  167. data[3][3] = 8;
  168. mate -> data = data;
  169. //printf("det %f", det(data, 4));
  170.  
  171. //print_matrix(mate);
  172. //print_matrix(mate);
  173. //matrix * mat = get_product_matrix(matria, mate);
  174. //free(mat);
  175. //print_matrix(mat);
  176. matrix *ma = get_inverse_matrix(mate);
  177. print_matrix(ma);
  178. free_matrix(ma);
  179.  
  180.  
  181. return 0;
  182. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement