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:
•
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.
1 typedef Array < double , Dynamic , 1> ArrayXd ;
Código 12: Ex_ArrayXd.cpp
1
2 Eigen :: ArrayXd x (3);
3
4 x << M_PI , M_E , 1.0;
5
6 x (2) = 2.0;
7
8 std :: cout << "x = \n" << x << std :: endl ;
•
Objeto da classe dos arranjos bidimensionais de tamanho dinâmico e de elementos do tipo double .
1 typedef Array < double , Dynamic , Dynamic > ArrayXXd ;
Código 13: Ex_ArrayXXd.cpp
1
2 Eigen :: ArrayXXd a (2, 3);
3
4 a << 0.0, 0.1, 0.2,
5 1.0, 1.1, 1.2;
6
7 a (1,0) = 2.0;
8
9 std :: cout << "a = \n" << a << std :: endl ;
•
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.
1 typedef Matrix < double , Dynamic , 1> VectorXd ;
Código 14: Ex_VectorXd.cpp
1
2 Eigen :: VectorXd v {{1.0, 2.0, 3.0}};
3
4 std :: cout << "dimensõ es de v: "
5 << v . rows () << "x"
6 << v . cols () << std :: endl ;
7
8 std :: cout << "v =\n" << v << std :: endl ;
•
Objetos da classe dos vetores linha de tamanho dinâmico e de elementos do tipo double .
1 typedef Matrix < double , 1, Dynamic > RowVectorXd ;
Código 15: Ex_RowVectorXd.cpp
1
2 Eigen :: RowVectorXd w (3);
3 w << 1.0, 2.0, 3.0;
4
5 std :: cout << "Tamanho de w: "
6 << w . size () << std :: endl ;
7
8 std :: cout << "w =\n" << w << std :: endl ;
•
Objetos da classe das matrizes de tamanho dinâmico e de elementos do tipo double . Objeto para modelagem computacional com operações matriciais.
1 typedef Matrix < double , Dynamic , Dynamic > MatrixXd ;
Código 16: Ex_MatrixXd.cpp
1
2 Eigen :: MatrixXd m (3, 2);
3
4 m << 1.0, 2.0,
5 3.0, 4.0,
6 5.0, 6.0;
7 m (0,0) += m (2,1);
8
9 std :: 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 typedef s 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 , e − 2 )
(4.2)
e compute o vetor w → = ( w 1 , w 2 , w 3 ) de elementos w i = u i v i , i = 1,2,3 .
Resposta
1 #include < iostream >
2 #include < cmath >
3 #include < eigen3 / Eigen / Eigen >
4
5 int 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 = [ − 1 1 3 2 2 / 2 e − 1 − 3 ] ,
(4.3)
v → = [ − 5 , π / 2 , sen ( π / 3 ) ] .
(4.4)
e compute o vetor w → = [ w 1 , w 2 ] de elementos
para j = 1,2 .
Resposta
1 #include < iostream >
2 #include < cmath >
3 #include < eigen3 / Eigen / Eigen >
4
5 int 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 .
Resposta
1 #include < iostream >
2 #include < eigen3 / Eigen / Eigen >
3
4
5 double det ( Eigen :: Matrix3d & A )
6 {
7
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
16 int 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árioAproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!
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.