| | | |

Minicurso de C++ para Matemática

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

4.1 Arranjos, matrizes e vetores

Eigen fornece objetos para arranjos de elementos (1D e 2D), matrizes e vetores (matriz linha ou coluna). Os padrões das classes são:

  • Eigen::ArrayXd

    Objeto da classe dos arranjos de tamanho dinâmico e de elementos do tipo double. Objeto para organização e processamento de dados com operações elemento-a-elemento.

    1typedef Array<double, Dynamic, 1> ArrayXd;
    Código 12: Ex_ArrayXd.cpp
    1// Array 1D de 3 elementos double
    2Eigen::ArrayXd x(3);
    3// Inicialização
    4x << M_PI, M_E, 1.0;
    5// atribuição de elemento
    6x(2) = 2.0;
    7// Impressão
    8std::cout << "x = \n" << x << std::endl;
  • Eigen::ArrayXXd

    Objeto da classe dos arranjos bidimensionais de tamanho dinâmico e de elementos do tipo double.

    1typedef Array<double, Dynamic, Dynamic> ArrayXXd;
    Código 13: Ex_ArrayXXd.cpp
    1// Array 2D 2x3
    2Eigen::ArrayXXd a(2, 3);
    3// Inicialização
    4a << 0.0, 0.1, 0.2,
    5 1.0, 1.1, 1.2;
    6// atribuição de elemento
    7a(1,0) = 2.0;
    8// Impressão
    9std::cout << "a = \n" << a << std::endl;
  • Eigen::VectorXd

    Objeto da classe dos vetores coluna (matriz n x 1) de tamanho dinâmico e de elementos do tipo double. Objeto para modelagem computacional de vetores colunas com operações matriciais.

    1typedef Matrix<double, Dynamic, 1> VectorXd;
    Código 14: Ex_VectorXd.cpp
    1// Vetor coluna
    2Eigen::VectorXd v {{1.0, 2.0, 3.0}};
    3// dimensões
    4std::cout << "dimensões de v: "
    5 << v.rows() << "x"
    6 << v.cols() << std::endl;
    7// imprime
    8std::cout << "v =\n" << v << std::endl;
  • Eigen::RowVectorXd

    Objetos da classe dos vetores linha de tamanho dinâmico e de elementos do tipo double.

    1typedef Matrix<double, 1, Dynamic> RowVectorXd;
    Código 15: Ex_RowVectorXd.cpp
    1// Vetor linha
    2Eigen::RowVectorXd w(3);
    3w << 1.0, 2.0, 3.0;
    4// dimensões
    5std::cout << "Tamanho de w: "
    6 << w.size() << std::endl;
    7// imprime
    8std::cout << "w =\n" << w << std::endl;
  • Eigen::MatrixXd

    Objetos da classe das matrizes de tamanho dinâmico e de elementos do tipo double. Objeto para modelagem computacional com operações matriciais.

    1typedef Matrix<double, Dynamic, Dynamic> MatrixXd;
    Código 16: Ex_MatrixXd.cpp
    1// Matriz 3x2
    2Eigen::MatrixXd m(3, 2);
    3// Inicialização
    4m << 1.0, 2.0,
    5 3.0, 4.0,
    6 5.0, 6.0;
    7m(0,0) += m(2,1);
    8// Impressão
    9std::cout << "m = \n" << m << std::endl;
Observação 4.1.1.(Outros tipos de elementos)

Os elementos das matrizes e arranjos podem ser de outros tipos, como int ou float. Por conveniência, temos typedefs para os tipos mais comuns. Por exemplo, para objetos com elementos int temos ArrayXi, ArrayXXi, VectorXi, RowVectorXi e MatrixXi.

E. 4.1.1.

Faça um código que aloque os vetores

u=(1.2,3.1,4), (4.1)
v=(π,2,e2) (4.2)

e compute o vetor w=(w1,w2,w3) de elementos wi=uivi, i=1,2,3.


1#include <iostream>
2#include <cmath>
3#include <eigen3/Eigen/Eigen>
4
5int main()
6{
7 Eigen::VectorXd u(3);
8 u << 1.2, -3.1, 4.0;
9
10 Eigen::VectorXd v(3);
11 v << M_PI, M_SQRT2, 1.0/(M_E*M_E);
12
13 Eigen::VectorXd w(u.size());
14
15 for (int i=0; i<u.size(); i++)
16 {
17 w(i) = u(i) * v(i);
18 }
19
20 std::cout << "w =\n"
21 << w << std::endl;
22
23 return 0;
24}
E. 4.1.2.

Crie um código que aloque a matriz e o vetor

A=[11322/2e13], (4.3)
v=[5,π/2,sen(π/3)]. (4.4)

e compute o vetor w=[w1,w2] de elementos

wj=i=13viAij. (4.5)

para j=1,2.


1#include <iostream>
2#include <cmath>
3#include <eigen3/Eigen/Eigen>
4
5int main()
6{
7 Eigen::MatrixXd A {{-1.0, 1.0/3,},
8 { 2.0, M_SQRT1_2},
9 { 1.0/M_E, -3.0}};
10
11 Eigen::RowVectorXd v(3);
12 v << -5.0, M_PI_2, sin(M_PI/3);
13
14 Eigen::RowVectorXd w(A.cols());
15
16 for (int j=0; j<A.cols(); j++) {
17 w(j) = 0.0;
18 for (int i=0; i<A.rows(); i++) {
19 w(j) += v(j) * A(i,j);
20 }
21 }
22
23 std::cout << "w =\n"
24 << w << std::endl;
25
26 return 0;
27}
E. 4.1.3.

Implemente uma função que computa o determinante de matrizes reais A 3×3. Compare o resultado com o método A.determinant() da Eigen.


1#include <iostream>
2#include <eigen3/Eigen/Eigen>
3
4
5double det(Eigen::Matrix3d &A)
6{
7 // Determinante de uma matriz 3x3
8 return A(0, 0) * (A(1, 1) * A(2, 2) - \
9 A(1, 2) * A(2, 1)) -\
10 A(0, 1) * (A(1, 0) * A(2, 2) - \
11 A(1, 2) * A(2, 0)) +\
12 A(0, 2) * (A(1, 0) * A(2, 1) - \
13 A(1, 1) * A(2, 0));
14}
15
16int main()
17{
18 Eigen::Matrix3d A;
19 A << -1.0, -2.0, -1.0,
20 2.0, 1.0, 0.0,
21 1.0, -1.0, -2.0;
22
23 std::cout << "A =\n" << std::endl
24 << A << std::endl;
25 std::cout << "det(A) = "
26 << det(A) << std::endl;
27
28 return 0;
29}

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
| | | |