matrix.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #include "matrix.h"
  2. #include <stdio.h>
  3. void
  4. print_matrix(float m[9])
  5. {
  6. printf(" [%+.2f %+.2f %+.2f] \n", m[0], m[1], m[2]);
  7. printf(" [%+.2f %+.2f %+.2f] \n", m[3], m[4], m[5]);
  8. printf(" [%+.2f %+.2f %+.2f] \n\n", m[6], m[7], m[8]);
  9. }
  10. void
  11. multiply_matrices(const float a[9], const float b[9], float out[9])
  12. {
  13. // zero out target matrix
  14. for (int i = 0; i < 9; i++) {
  15. out[i] = 0;
  16. }
  17. for (int i = 0; i < 3; i++) {
  18. for (int j = 0; j < 3; j++) {
  19. for (int k = 0; k < 3; k++) {
  20. out[i * 3 + j] += a[i * 3 + k] * b[k * 3 + j];
  21. }
  22. }
  23. }
  24. }
  25. void
  26. invert_matrix(const float in[9], float out[9])
  27. {
  28. float det = in[0] * (in[4] * in[8] - in[5] * in[7]) -
  29. in[1] * (in[3] * in[8] - in[5] * in[6]) +
  30. in[2] * (in[3] * in[7] - in[4] * in[7]);
  31. out[0] = (in[4] * in[8] - in[7] * in[5]) / det;
  32. out[1] = (in[7] * in[2] - in[1] * in[8]) / det;
  33. out[2] = (in[1] * in[5] - in[4] * in[2]) / det;
  34. out[3] = (in[6] * in[5] - in[3] * in[8]) / det;
  35. out[4] = (in[0] * in[8] - in[6] * in[5]) / det;
  36. out[5] = (in[3] * in[2] - in[0] * in[5]) / det;
  37. out[6] = (in[3] * in[7] - in[6] * in[4]) / det;
  38. out[7] = (in[6] * in[1] - in[0] * in[7]) / det;
  39. out[8] = (in[0] * in[4] - in[3] * in[1]) / det;
  40. }
  41. void
  42. transpose_matrix(const float in[9], float out[9])
  43. {
  44. for (int i = 0; i < 3; ++i)
  45. for (int j = 0; j < 3; ++j)
  46. out[i + j * 3] = in[j + i * 3];
  47. }