that_one_nigga_you_k

matrizes

Sep 4th, 2024
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.73 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cmath>
  4.  
  5. using namespace std;
  6.  
  7. typedef vector<vector<double>> Matriz;
  8.  
  9. Matriz criarMatriz(int n) {
  10.     return Matriz(n, vector<double>(n, 0));
  11. }
  12.  
  13. void imprimirMatriz(const Matriz& A) {
  14.     for (const auto& linha : A) {
  15.         for (double elemento : linha) {
  16.             cout << elemento << " ";
  17.         }
  18.         cout << endl;
  19.     }
  20. }
  21.  
  22. double calcularTraço(const Matriz& A) {
  23.     double traço = 0;
  24.     for (int i = 0; i < A.size(); ++i) {
  25.         traço += A[i][i];
  26.     }
  27.     return traço;
  28. }
  29.  
  30. Matriz obterTransposta(const Matriz& A) {
  31.     int n = A.size();
  32.     Matriz transposta = criarMatriz(n);
  33.     for (int i = 0; i < n; ++i) {
  34.         for (int j = 0; j < n; ++j) {
  35.             transposta[j][i] = A[i][j];
  36.         }
  37.     }
  38.     return transposta;
  39. }
  40.  
  41. double calcularDeterminante(const Matriz& A);
  42.  
  43. Matriz obterCofatores(const Matriz& A) {
  44.     int n = A.size();
  45.     Matriz cofatores = criarMatriz(n);
  46.     for (int i = 0; i < n; ++i) {
  47.         for (int j = 0; j < n; ++j) {
  48.             Matriz menor = criarMatriz(n - 1);
  49.             for (int k = 0; k < n; ++k) {
  50.                 if (k == i) continue;
  51.                 for (int l = 0; l < n; ++l) {
  52.                     if (l == j) continue;
  53.                     menor[k < i ? k : k - 1][l < j ? l : l - 1] = A[k][l];
  54.                 }
  55.             }
  56.             cofatores[i][j] = pow(-1, i + j) * calcularDeterminante(menor);
  57.         }
  58.     }
  59.     return cofatores;
  60. }
  61.  
  62. double calcularDeterminante(const Matriz& A) {
  63.     int n = A.size();
  64.     if (n == 1) return A[0][0];
  65.     if (n == 2) return A[0][0] * A[1][1] - A[0][1] * A[1][0];
  66.     double determinante = 0;
  67.     for (int j = 0; j < n; ++j) {
  68.         Matriz menor = criarMatriz(n - 1);
  69.         for (int k = 1; k < n; ++k) {
  70.             for (int l = 0; l < n; ++l) {
  71.                 if (l == j) continue;
  72.                 menor[k - 1][l < j ? l : l - 1] = A[k][l];
  73.             }
  74.         }
  75.         determinante += pow(-1, j) * A[0][j] * calcularDeterminante(menor);
  76.     }
  77.     return determinante;
  78. }
  79.  
  80. Matriz obterAdjunta(const Matriz& A) {
  81.     return obterTransposta(obterCofatores(A));
  82. }
  83.  
  84. Matriz obterInversa(const Matriz& A) {
  85.     double det = calcularDeterminante(A);
  86.     if (det == 0) throw runtime_error("Matriz não inversível");
  87.     Matriz adjunta = obterAdjunta(A);
  88.     int n = A.size();
  89.     Matriz inversa = criarMatriz(n);
  90.     for (int i = 0; i < n; ++i) {
  91.         for (int j = 0; j < n; ++j) {
  92.             inversa[i][j] = adjunta[i][j] / det;
  93.         }
  94.     }
  95.     return inversa;
  96. }
  97.  
  98. Matriz somarMatrizes(const Matriz& A, const Matriz& B) {
  99.     int n = A.size();
  100.     Matriz soma = criarMatriz(n);
  101.     for (int i = 0; i < n; ++i) {
  102.         for (int j = 0; j < n; ++j) {
  103.             soma[i][j] = A[i][j] + B[i][j];
  104.         }
  105.     }
  106.     return soma;
  107. }
  108.  
  109. Matriz multiplicarMatrizes(const Matriz& A, const Matriz& B) {
  110.     int n = A.size();
  111.     Matriz produto = criarMatriz(n);
  112.     for (int i = 0; i < n; ++i) {
  113.         for (int j = 0; j < n; ++j) {
  114.             for (int k = 0; k < n; ++k) {
  115.                 produto[i][j] += A[i][k] * B[k][j];
  116.             }
  117.         }
  118.     }
  119.     return produto;
  120. }
  121.  
  122. Matriz dividirMatrizes(const Matriz& A, const Matriz& B) {
  123.     return multiplicarMatrizes(A, obterInversa(B));
  124. }
  125.  
  126. Matriz elevarMatriz(const Matriz& A, int expoente) {
  127.     int n = A.size();
  128.     Matriz resultado = criarMatriz(n);
  129.     for (int i = 0; i < n; ++i) {
  130.         resultado[i][i] = 1;
  131.     }
  132.     Matriz base = A;
  133.     while (expoente > 0) {
  134.         if (expoente % 2 == 1) {
  135.             resultado = multiplicarMatrizes(resultado, base);
  136.         }
  137.         base = multiplicarMatrizes(base, base);
  138.         expoente /= 2;
  139.     }
  140.     return resultado;
  141. }
  142.  
  143. int main() {
  144.     int n;
  145.     cout << "Digite o tamanho da matriz (n): ";
  146.     cin >> n;
  147.  
  148.     Matriz A = criarMatriz(n);
  149.     cout << "Digite os elementos da matriz A:" << endl;
  150.     for (int i = 0; i < n; ++i) {
  151.         for (int j = 0; j < n; ++j) {
  152.             cin >> A[i][j];
  153.         }
  154.     }
  155.  
  156.     cout << "Matriz A:" << endl;
  157.     imprimirMatriz(A);
  158.  
  159.     cout << "Traço: " << calcularTraço(A) << endl;
  160.     cout << "Determinante: " << calcularDeterminante(A) << endl;
  161.  
  162.     Matriz cofatores = obterCofatores(A);
  163.     cout << "Matriz dos Cofatores:" << endl;
  164.     imprimirMatriz(cofatores);
  165.  
  166.     Matriz transposta = obterTransposta(A);
  167.     cout << "Matriz Transposta:" << endl;
  168.     imprimirMatriz(transposta);
  169.  
  170.     Matriz adjunta = obterAdjunta(A);
  171.     cout << "Matriz Adjunta:" << endl;
  172.     imprimirMatriz(adjunta);
  173.  
  174.     try {
  175.         Matriz inversa = obterInversa(A);
  176.         cout << "Matriz Inversa:" << endl;
  177.         imprimirMatriz(inversa);
  178.     } catch (const runtime_error& e) {
  179.         cout << e.what() << endl;
  180.     }
  181.  
  182.     Matriz B = criarMatriz(n);
  183.     cout << "Digite os elementos da matriz B:" << endl;
  184.     for (int i = 0; i < n; ++i) {
  185.         for (int j = 0; j < n; ++j) {
  186.             cin >> B[i][j];
  187.         }
  188.     }
  189.  
  190.     cout << "Matriz B:" << endl;
  191.     imprimirMatriz(B);
  192.  
  193.     Matriz soma = somarMatrizes(A, B);
  194.     cout << "Soma de A e B:" << endl;
  195.     imprimirMatriz(soma);
  196.  
  197.     Matriz produto = multiplicarMatrizes(A, B);
  198.     cout << "Produto de A e B:" << endl;
  199.     imprimirMatriz(produto);
  200.  
  201.     try {
  202.         Matriz divisao = dividirMatrizes(A, B);
  203.         cout << "Divisão de A por B:" << endl;
  204.         imprimirMatriz(divisao);
  205.     } catch (const runtime_error& e) {
  206.         cout << e.what() << endl;
  207.     }
  208.  
  209.     int expoente;
  210.     cout << "Digite o expoente para elevar a matriz A: ";
  211.     cin >> expoente;
  212.     Matriz potencia = elevarMatriz(A, expoente);
  213.     cout << "A^" << expoente << ":" << endl;
  214.     imprimirMatriz(potencia);
  215.  
  216.     return 0;
  217. }
  218.  
Add Comment
Please, Sign In to add comment