| | | |

Minicurso de C++ para Matemática

Ajude a manter o site livre, gratuito e sem propagandas. Colabore!

4.3 Operações matriciais

A Eigen oferece operações matriciais como soma, subtração e multiplicação de matrizes pela sobrecarga dos operadores +, - e *, respectivamente.

4.3.1 Adição e subtração

A adição e subtração de matrizes ou vetores é feita com os operadores + e -, respectivamente. A adição e subtração de matrizes e vetores é feita elemento-a-elemento. Para a adição e subtração de matrizes, as dimensões devem ser compatíveis. Para a adição e subtração de vetores, os tamanhos devem ser compatíveis. Se não forem, o programa falha e interrompe sua execução. Estudemos o seguinte código.

Código 18: ExSomaDiferenca.cpp
1#include <iostream>
2#include <eigen3/Eigen/Eigen>
3
4int main()
5{
6 // adição de matrizes
7 Eigen::MatrixXd a {{1,2},{3,4}};
8 Eigen::MatrixXd b {{5,6},{7,8}};
9
10 std::cout << "a + b = \n" <<
11 a + b << std::endl;
12
13 // subtração de vetores
14 Eigen::VectorXd v {{1,2,3}};
15 Eigen::VectorXd w {{4,5,6}};
16
17 std::cout << "v + w = \n" <<
18 v - w << std::endl;
19
20
21 return 0;
22}
a + b =
6 8
10 12
v + w =
-3
-3
-3

4.3.2 Multiplicação e divisão por escalar

A multiplicação e divisão de matrizes e vetores por escalares é feita com os operadores * e /, respectivamente. Estudemos o seguinte código.

Código 19: ExEscalar.cpp
1#include <iostream>
2#include <eigen3/Eigen/Eigen>
3
4int main()
5{
6 double alpha = 0.5;
7 Eigen::MatrixXd a {{1,2},{3,4}};
8 Eigen::VectorXd v {{1,2,3}};
9
10 std::cout << "2a = \n" <<
11 2*a << std::endl;
12
13 std::cout << "v/alpha = \n" <<
14 v/alpha << std::endl;
15
16 return 0;
17}
2a =
2 4
6 8
v/alpha =
2
4
6

4.3.3 Multiplicação de matrizes

A multiplicação de matrizes é feita com o operador *. A multiplicação de matrizes é feita com a regra da álgebra linear. Para a multiplicação de matrizes, as dimensões devem ser compatíveis. Se não forem, o programa falha e interrompe sua execução. Estudemos o seguinte código.

Código 20: ExMultMatrizes.cpp
1#include <iostream>
2#include <eigen3/Eigen/Eigen>
3
4int main()
5{
6 Eigen::MatrixXd a {{1,2,3},
7 {3,4,5}};
8 Eigen::MatrixXd b {{-2,1},
9 {1,-1},
10 {1,1}};
11
12 std::cout << "a*b = \n" <<
13 a*b << std::endl;
14
15 Eigen::RowVectorXd u {{1,2,3}};
16
17 std::cout << "u*b = \n" <<
18 u*b << std::endl;
19
20 return 0;
21}
a*b =
3 2
3 4
u*b =
3 2
E. 4.3.1.

Considere o seguinte sistema de equações lineares

2x1+3x2=1 (4.7)
3x14x2=7. (4.8)

Escreva um código que aloque a matriz dos coeficientes A e o vetor dos termos constantes b do sistema. Então, verifique se o vetor x=(1,1) é solução do sistema.


1#include <iostream>
2#include <eigen3/Eigen/Eigen>
3
4int main()
5{
6 Eigen::MatrixXd a {{2,3},
7 {3,-4}};
8 Eigen::VectorXd b {{-1,7}};
9 Eigen::VectorXd x {{1,-1}};
10
11 std::cout << "a*x - b = \n"
12 << a*x - b << std::endl;
13
14 return 0;
15}
E. 4.3.2.

Considere o seguinte sistema de equações lineares

2x1+3x2+4x3=1 (4.9)
3x14x2+5x3=7 (4.10)
x1+x2x3=0. (4.11)

Escreva um código que aloque a matriz dos coeficientes A e o vetor dos termos constantes b do sistema. Então, aloque a matriz estendida E=[A|b] e compute a equivalente matriz estendida reduzida E[I|x]. Por fim, aloque e imprima o vetor solução x.


1#include <iostream>
2#include <eigen3/Eigen/Eigen>
3
4#define all Eigen::placeholders::all
5
6int main()
7{
8 // matrix dos coefs
9 Eigen::MatrixXd a {{2,3,4},
10 {3,-4,5},
11 {1,1,-1}};
12 // vetor dos termos constantes
13 Eigen::VectorXd b {{-1,7,0}};
14
15 // matrix estendida
16 Eigen::MatrixXd ab(a.rows(), a.cols() + 1);
17 ab << a, b;
18 std::cout << "Matriz estendida:\n" << ab << std::endl;
19
20 // escalonamento
21 ab(1,all) -= (ab(1,0) / ab(0,0)) * ab(0,all);
22 ab(2,all) -= (ab(2,0) / ab(0,0)) * ab(0,all);
23 ab(2,all) -= (ab(2,1) / ab(1,1)) * ab(1,all);
24
25 std::cout << "Matriz escalonada:\n" << ab << std::endl;
26
27 // redução
28 ab(1,all) -= (ab(1,2) / ab(2,2)) * ab(2,all);
29 ab(0,all) -= (ab(0,2) / ab(2,2)) * ab(2,all);
30 ab(0,all) -= (ab(0,1) / ab(1,1)) * ab(1,all);
31 ab(1,all) /= ab(1,1);
32 ab(2,all) /= ab(2,2);
33 ab(0,all) /= ab(0,0);
34
35 std::cout << "Matriz reduzida:\n" << ab << std::endl;
36
37 // solução
38 Eigen::VectorXd x(ab.rows());
39 x << ab(all, ab.cols()-1);
40
41 std::cout << "Solução x = \n" << x << std::endl;
42 return 0;
43}

Envie seu comentário

Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!

Opcional. Preencha seu nome para que eu possa lhe contatar.
Opcional. Preencha seu e-mail para que eu possa lhe contatar.
As informações preenchidas são enviadas por e-mail para o desenvolvedor do site e tratadas de forma privada. Consulte a política de uso de dados para mais informações.

Licença Creative Commons
Este texto é disponibilizado nos termos da Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional. Ícones e elementos gráficos podem estar sujeitos a condições adicionais.

Pedro H A Konzen
| | | |