<commit_before>#ifndef CALCNUM_MATRIZ_H
#define CALCNUM_MATRIZ_H

#include <algorithm>
#include <iostream>

using std::ostream;
using std::istream;
using std::copy;

template<typename T> class VetorT;

// Matriz m x n de elementos do tipo T
// segue disposição mostrada no link abaixo
// <http://en.wikipedia.org/wiki/Matrix_(mathematics)>
template<typename T>
class MatrizT {
 public:
  // Matriz quadrada de ordem n
  MatrizT(const int n) : m_(n), n_(n), matriz_(new T[n * n]) {}
  // Matriz retangular m x n
  MatrizT(const int m, const int n) : m_(m), n_(n), matriz_(new T[m * n]) {}
  // Copiar outra matriz
  MatrizT(const MatrizT &outra)
      : m_(outra.m_),
        n_(outra.n_),
        matriz_(new T[outra.m_ * outra.n_]) {
    copy(outra.matriz_, outra.matriz_ + m_ * n_, matriz_);
  }
  ~MatrizT() { delete[] matriz_; }

  // Operador para acessar o elemento i,j chamando m(i,j).
  // Se i ou j estiver fora do tamanho da matriz o comportamento
  // não é definido, pode ser retornado o termo errado ou ocorrerá
  // um erro de acesso na memória.
  inline T &operator()(const int i, const int j) { return matriz_[j - 1 + (i - 1) * n_]; }
  inline T operator()(const int i, const int j) const { return matriz_[j - 1 + (i - 1) * n_]; }

  // Métodos para ler a ordem da matriz.
  inline int m() const { return m_; }
  inline int n() const { return n_; }
  // Retorna true se for quadrada.
  inline bool Quadrada() const { return m_ == n_; }

  //// Os seguintes algoritmos são implementados em .h próprios.
  // Calcula o determinante assumindo que a matriz é quadrada.
  // Métodos que não são const são destrutivos e alteram a própria matriz
  T Determinante();
  MatrizT Inversa();
  void InversaLocal();
  // Pivoteamento da i-ésima linha pra baixo, retorna k se trocar com a k-ésima
  // linha, se não houver troca retorna 0 (poderia retorna i, mas 0 é mais pratico).
  int Pivot(const int i);
  // Faz a troca também no vetor b.
  int Pivot(const int i, VetorT<T> &b);
  // Faz a troca também na matriz m
  int Pivot(const int i, MatrizT<T> &m);
  /// Resolução de sistemas usando os métodos de (b é o vetor dos coeficientes):
  VetorT<T> LU(VetorT<T> &b);
  // Assume-se que m = n + 1 e a última coluna é o vetor dos coeficientes.
  VetorT<T> LUC();
  VetorT<T> GaussJordan(VetorT<T> &b);
  VetorT<T> GaussJacobi(VetorT<T> &b);
  VetorT<T> GaussSeidel(VetorT<T> &b);
  // Assume-se que m = n + 1 e a última coluna é o vetor dos coeficientes.<commit_msg>Inversa local retorna bool se possui inversa ou não.<commit_after>#ifndef CALCNUM_MATRIZ_H
#define CALCNUM_MATRIZ_H

#include <algorithm>
#include <iostream>

using std::ostream;
using std::istream;
using std::copy;

template<typename T> class VetorT;

// Matriz m x n de elementos do tipo T
// segue disposição mostrada no link abaixo
// <http://en.wikipedia.org/wiki/Matrix_(mathematics)>
template<typename T>
class MatrizT {
 public:
  // Matriz quadrada de ordem n
  MatrizT(const int n) : m_(n), n_(n), matriz_(new T[n * n]) {}
  // Matriz retangular m x n
  MatrizT(const int m, const int n) : m_(m), n_(n), matriz_(new T[m * n]) {}
  // Copiar outra matriz
  MatrizT(const MatrizT &outra)
      : m_(outra.m_),
        n_(outra.n_),
        matriz_(new T[outra.m_ * outra.n_]) {
    copy(outra.matriz_, outra.matriz_ + m_ * n_, matriz_);
  }
  ~MatrizT() { delete[] matriz_; }

  // Operador para acessar o elemento i,j chamando m(i,j).
  // Se i ou j estiver fora do tamanho da matriz o comportamento
  // não é definido, pode ser retornado o termo errado ou ocorrerá
  // um erro de acesso na memória.
  inline T &operator()(const int i, const int j) { return matriz_[j - 1 + (i - 1) * n_]; }
  inline T operator()(const int i, const int j) const { return matriz_[j - 1 + (i - 1) * n_]; }

  // Métodos para ler a ordem da matriz.
  inline int m() const { return m_; }
  inline int n() const { return n_; }
  // Retorna true se for quadrada.
  inline bool Quadrada() const { return m_ == n_; }

  //// Os seguintes algoritmos são implementados em .h próprios.
  // Calcula o determinante assumindo que a matriz é quadrada.
  // Métodos que não são const são destrutivos e alteram a própria matriz
  T Determinante();
  MatrizT Inversa();
  // retorna true se for inversível
  bool InversaLocal();
  // Pivoteamento da i-ésima linha pra baixo, retorna k se trocar com a k-ésima
  // linha, se não houver troca retorna 0 (poderia retorna i, mas 0 é mais pratico).
  int Pivot(const int i);
  // Faz a troca também no vetor b.
  int Pivot(const int i, VetorT<T> &b);
  // Faz a troca também na matriz m
  int Pivot(const int i, MatrizT<T> &m);
  /// Resolução de sistemas usando os métodos de (b é o vetor dos coeficientes):
  VetorT<T> LU(VetorT<T> &b);
  // Assume-se que m = n + 1 e a última coluna é o vetor dos coeficientes.
  VetorT<T> LUC();
  VetorT<T> GaussJordan(VetorT<T> &b);
  VetorT<T> GaussJacobi(VetorT<T> &b);
  VetorT<T> GaussSeidel(VetorT<T> &b);
  // Assume-se que m = n + 1 e a última coluna é o vetor dos coeficientes.
{'fraction_non_alphanumeric': 0.12058999402033088, 'fraction_numerical': 0.0031891568666533787, 'mean_word_length': 3.231028667790894, 'pattern_counts': {'":': 0, '<': 35, '<?xml version=': 0, '>': 35, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '189130', 'n_tokens_mistral': 2004, 'n_tokens_neox': 1956, 'n_words': 676}