Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Matrix GaussianElimination() {
- int curRow = 0; //строка
- int curCol = 0; //колонка
- double* newElements = new double[n*m];
- for (int i = 0; i < n * m; i++)
- newElements[i] = this->elements[i];
- while (curCol < m) {
- int nonZeroRow = curRow;
- bool zeroCol = false;
- while (newElements[nonZeroRow * n + curCol] == 0) { //проходимся по curCol элементам векторов начиная с curRow-го
- nonZeroRow++;
- if (nonZeroRow == n) {
- zeroCol = true;
- break;
- }
- }
- if (!zeroCol) { //нашли вектор с ненулевым curCol элементом
- if (nonZeroRow != curRow) {
- for (int k = 0; k < m; k++) {
- double temp = newElements[curRow * n + k];
- newElements[curRow * n + k] = newElements[nonZeroRow * n + k];
- newElements[nonZeroRow * n + k] = temp;
- }
- }
- }
- else {
- curCol++; //Следующая координата
- continue;
- }
- if (newElements[curRow * n + curCol] != 1) {
- double el = newElements[curRow * n + curCol];
- for (int k = 0; k < m; k++) {
- newElements[curRow*n + k] /= el; //нормализуем вектор по curCol элемету
- }
- }
- for (int i = curRow + 1; i < n; i++) { //Вычитаем curRow вектор из остальных с коэффициентом
- for (int k = 0; k < m; k++) {
- newElements[i*n + k] -= newElements[curRow * n + k] * newElements[i*n + curCol];
- }
- }
- curCol++; //Следующая координата
- curRow++; //Следующий вектор
- }
- return Matrix(n, m, newElements);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement