Ответ в теме: Приведения матрицы к треугольному виду на С++

#3949

В некоторых случаях требуется приводить к треугольному виду матрицу, не являющуюся квадратной. При этом не подойдет алгоритм, описанный выше. Например, такая операция нужна при решении СЛАУ методом Гаусса, т.к. расширенная матрица системы содержит также столбец свободных членов (ее размерность N на N+1). При выполнении операции над элементами строки матрицы (например, умножение на константу, сложение или перестановка с элементами другой строки) действия должны выполняться и с элементов столбца свободных членов.

Описанная выше функция не подойдет, однако ее можно доработать:

template <typename T>
int triangulation(std::vector<std::vector<T> > &matrix, int n) {
  unsigned int swapCount = 0;

  if (0 == n)
    return swapCount;

  const int num_cols = matrix[0].size();
  for (int i = 0; i < n-1; ++i) {
    unsigned int imax = col_max(matrix, i, n);
    if (i != imax) {
      swap(matrix[i], matrix[imax]);
      ++swapCount;
    }

    for (int j = i + 1; j < n; ++j) {
      T mul = -matrix[j][i]/matrix[i][i];
      for (int k = i; k < num_cols; ++k) {
        matrix[j][k] += matrix[i][k]*mul;
      }
    }
  }
  return swapCount;
}

Тут при обработке элементов строки элементы перебираются не до n-1, а до matrix[0].size()-1. Полагаем, что все строки матрицы имеют одинаковую длину.