Advertisement
Guest User

Untitled

a guest
Feb 21st, 2020
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.27 KB | None | 0 0
  1. using namespace std;
  2.  
  3. void getCfactor(vector<vector<float >> &M, vector<vector<float >> &t, int p, int q, int n) {
  4. int i = 0, j = 0;
  5. for (int r = 0; r < n; r++) {
  6. for (int c = 0; c < n; c++) //Copy only those elements which are not in given row r and column c: {
  7. if (r != p && c != q) {
  8. t[i][j++] = M[r][c]; //If row is filled increase r index and reset c index
  9. if (j == n - 1) {
  10. j = 0;
  11. i++;
  12. }
  13. }
  14. }
  15. }
  16.  
  17. float DET(vector<vector<float >> &matrix, int n) {
  18. float D = 0;
  19. if (n == 1)
  20. return matrix[0][0];
  21.  
  22. vector<vector<float>> t = vector<vector<float>> (matrix.size());
  23. for (int i = 0; i < matrix.size(); i++) {
  24. t[i] = vector<float > (matrix.size());
  25. }
  26. float s = 1; //store sign multiplier //
  27. for (int f = 0; f < n; f++) {
  28. getCfactor(matrix, t, 0, f, n);
  29. D += s * matrix[0][f] * DET(t, n - 1);
  30. s = -s;
  31. }
  32. return D;
  33. }
  34.  
  35. void ADJ(vector<vector<float >> &M, vector<vector<float >> &adj) {
  36. if (M.size() == 1) {
  37. adj[0][0] = 1;
  38. return;
  39. }
  40. float s = 1;
  41. vector<vector<float>> t = vector<vector<float>> (M.size());
  42. for (int i = 0; i < M.size(); i++) {
  43. t[i] = vector<float > (M.size());
  44. }
  45. for (int i = 0; i < M.size(); i++) {
  46. for (int j = 0; j < M.size(); j++) {
  47. getCfactor(M, t, i, j, M.size());
  48. s = ((i + j) % 2 == 0) ? 1 : -1; //sign of adj[j][i] positive if sum of row and column indexes is even.
  49. adj[j][i] = (s) * (DET(t, M.size() - 1)); //Interchange rows and columns to get the transpose of the cofactor matrix
  50. }
  51. }
  52. }
  53.  
  54. bool INV(vector<vector<float>> &matrix, vector<vector<float>> &res) {
  55. float det = DET(matrix, matrix.size());
  56. if (det == 0) {
  57. cout << "can't find its inverse";
  58. return false;
  59. }
  60. vector<vector<float>> adj = vector<vector<float>>(matrix.size());
  61. for (int i = 0; i < matrix.size(); i++) {
  62. adj[i] = vector<float > (matrix.size());
  63. }
  64. ADJ(matrix, adj);
  65. for (int i = 0; i < matrix.size(); i++) for (int j = 0; j < matrix.size(); j++) res[i][j] = adj[i][j] / float(det);
  66. return true;
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement