Advertisement
AlezM

Untitled

Mar 24th, 2017
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.64 KB | None | 0 0
  1. Matrix GaussianElimination() {
  2.         int curRow = 0; //строка
  3.         int curCol = 0; //колонка
  4.        
  5.         double* newElements = new double[n*m];
  6.         for (int i = 0; i < n * m; i++)
  7.             newElements[i] = this->elements[i];
  8.  
  9.         while (curCol < m) {
  10.             int nonZeroRow = curRow;
  11.             bool zeroCol = false;
  12.             while (newElements[nonZeroRow * n + curCol] == 0) { //проходимся по curCol элементам векторов начиная с curRow-го
  13.                 nonZeroRow++;
  14.                 if (nonZeroRow == n) {
  15.                     zeroCol = true;
  16.                     break;
  17.                 }
  18.             }
  19.  
  20.             if (!zeroCol) { //нашли вектор с ненулевым curCol элементом
  21.                 if (nonZeroRow != curRow) {
  22.                     for (int k = 0; k < m; k++) {
  23.                         double temp = newElements[curRow * n + k];
  24.                         newElements[curRow * n + k] = newElements[nonZeroRow * n + k];
  25.                         newElements[nonZeroRow * n + k] = temp;
  26.                     }
  27.                 }
  28.             }
  29.             else {
  30.                 curCol++; //Следующая координата
  31.                 continue;
  32.             }
  33.  
  34.             if (newElements[curRow * n + curCol] != 1) {
  35.                 double el = newElements[curRow * n + curCol];
  36.                 for (int k = 0; k < m; k++) {
  37.                     newElements[curRow*n + k] /= el; //нормализуем вектор по curCol элемету
  38.                 }
  39.             }
  40.  
  41.             for (int i = curRow + 1; i < n; i++) { //Вычитаем curRow вектор из остальных с коэффициентом
  42.                 for (int k = 0; k < m; k++) {
  43.                     newElements[i*n + k] -= newElements[curRow * n + k] * newElements[i*n + curCol];
  44.                 }
  45.             }
  46.             curCol++; //Следующая координата
  47.             curRow++; //Следующий вектор
  48.         }
  49.  
  50.         return Matrix(n, m, newElements);
  51.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement