Advertisement
Nexeon

Untitled

Feb 2nd, 2018
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.93 KB | None | 0 0
  1. void Matrix::eliminate()
  2. {
  3. /*
  4.  
  5. []-> [][][][]
  6. []-> [][][][]
  7. []-> [][][][]
  8.  
  9. */
  10.  
  11. /*
  12. Прямой ход
  13. Задача: Получить верхнюю треугольную матрицу и единицы на главной диагонали
  14. */
  15.  
  16. std::vector<double> row;
  17.  
  18. int totalRows = _size + 1;
  19. int totalColoumns = _size;
  20.  
  21. #pragma omp parallel for
  22. for (int n = 0; n < _size; n++) {
  23.  
  24. /* 1. Search the row with one non-zero value */
  25.  
  26. for (int j = n; j < totalRows; j++) {
  27. for (int i = n; i < totalColoumns; i++) {
  28. row.push_back(_matrix[i][j]);
  29. }
  30.  
  31. if (std::any_of(row.cbegin(), row.cend(), [](auto a) -> bool { return a != 0; })) {
  32. if (row[0] == 0) {
  33. for (int i = n + 1; i < totalColoumns; i++) {
  34. if (_matrix[i][j] != 0) {
  35. std::swap(_matrix[i], _matrix[n]);
  36. std::swap(row[i - n], row[0]);
  37. break;
  38. }
  39. }
  40. }
  41. break;
  42. }
  43. else {
  44. row.clear();
  45. continue;
  46. }
  47. }
  48.  
  49.  
  50. /* 2. Divide the each element of first n-coloumn by frist element of choosen row */
  51. // Make the 1 on base diagonal
  52.  
  53. for (int j = n; j < totalRows; j++) {
  54. if (!row.empty()) {
  55. _matrix[n][j] /= row[0]; // TODO: Check for zero value
  56. }
  57. }
  58.  
  59. /* 3. */
  60. // Make the 0 under base diagonal
  61.  
  62. for (int i = (n + 1); i < totalColoumns; i++) {
  63. double firstEl = _matrix[i][n];
  64. for (int j = n; j < totalRows; j++) {
  65. _matrix[i][j] -= (_matrix[n][j] * firstEl);
  66. }
  67. }
  68.  
  69. row.clear();
  70. }
  71.  
  72. /*
  73. Обратный ход
  74. Задача: Получить единичную матрицу на месте основной
  75. */
  76.  
  77. double c = 0; // Коэффицент
  78.  
  79. for (int i = _size - 1; i > 0; i--) { // Элемент диагонали
  80. for (int k = i - 1; k >= 0; k--) { // Строка
  81. c = _matrix[k][i];
  82. _matrix[k][i] -= _matrix[i][i] * c;
  83. _matrix[k][_size] -= _matrix[i][_size] * c;
  84. }
  85. }
  86.  
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement