| | | |

Minicurso de C++ para Matemática

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

4.2 Blocos e fatiamentos

4.2.1 Blocos

Eigen permite acessar blocos de matrizes e vetores com o método block(i, j, n, m), onde i e j são as coordenadas iniciais do bloco e n e m são as dimensões do bloco. O método block retorna um objeto do tipo Eigen::Block que pode ser manipulado como uma matriz ou vetor.

1Eigen::MatrixXd A(4,4);
2A << 1, 2, 3, 4,
3 5, 6, 7, 8,
4 9, 10, 11, 12,
5 13, 14, 15, 16;
6
7Eigen::Block block = A.block(1,0,3,2);
8std::cout << "A[1:3, 0:2] =\n"
9 << block << std::endl;
10
11block(1,1) = 99;
12std::cout << "A =\n"
13 << A << std::endl;
A[1:3, 0:2] =
5 6
9 10
13 14
A =
1 2 3 4
5 6 7 8
9 99 11 12
13 14 15 16

4.2.2 Linhas e colunas

Eigen permite acessar linhas e colunas de matrizes com o método row(i) e col(j), respectivamente. O método row e col retorna um objeto do tipo Eigen::Matrix que pode ser manipulado como um vetor ou matriz.

1Eigen::MatrixXd A(4,4);
2A << 1, 2, 3, 4,
3 5, 6, 7, 8,
4 9, 10, 11, 12,
5 13, 14, 15, 16;
6
7std::cout << "A[1,:] = "
8 << A.row(1) << std::endl;
9
10A.col(2) << 0, 0, 0, 0;
11std::cout << "A = " << A << std::endl;
A[1,:] = 5 6 7 8
A = 1 2 0 4
5 6 0 8
9 10 0 12
13 14 0 16

4.2.3 Fatiamentos

O fatiamento de matrizes é convenientemente feito com o ajuda do método Eigen::seq(firstIdx,lastIdx,incr), uma sequência de inteiros de firstIdx até lastIdx com incremento incr. Por exemplo, Eigen::seq(0,10,2) retorna a sequência 0, 2, 4, 6, 8, 10. Estudemos o seguinte código.

Código 17: Ex_slice.cpp
1#include <iostream>
2#include <eigen3/Eigen/Eigen>
3
4int main()
5{
6 Eigen::MatrixXd m(3,4);
7 m << 1, 2, 3, -1,
8 4, 5, 6, -2,
9 7, 8, 9, -3;
10 std::cout << "m =" << std::endl
11 << m << std::endl;
12
13 std::cout << "m[1:2,0:3:2] =" << std::endl
14 << m(Eigen::seq(1,2), Eigen::seq(0,3,2)) << std::endl;
15
16 std::cout << "m[:,1:3:2] =" << std::endl
17 << m(Eigen::placeholders::all, Eigen::seq(1,3,2)) << std::endl;
18
19 Eigen::ArrayXi ind {{0, 1, 3}};
20 std::cout << "m[:,(0,1,3)] =" << std::endl
21 << m(Eigen::placeholders::all, ind) << std::endl;
22
23 return 0;
24}
m =
1 2 3 -1
4 5 6 -2
7 8 9 -3
m[1:2,0:3:2] =
4 6
7 9
m[:,1:3:2] =
2 -1
5 -2
8 -3
m[:,(0,1,3)] =
1 2 -1
4 5 -2
7 8 -3
Observação 4.2.1.(Mais sobre fatiamentos)

Consulte mais sobre fatiamentos em Eigen::Slicing and Indexing.

E. 4.2.1.

Faça um código que aloque a matriz

A=[12345678910111213141516] (4.6)

e imprima os seguintes fatiamentos:

  1. a)

    A[1:3,0:2]

  2. b)

    A[0:2,1:3:2]

  3. c)

    A[0:2:2,0:3:3]

  4. d)

    A[0:3:2,:]

  5. e)

    A[(0,2,3),1:3]


a) a[1:3,0:2] =
5 6 7
9 10 11
13 14 15
b) a[0:2,1:3:2] =
2 4
6 8
10 12
c) a[0:2:2,0:3:3] =
1 4
9 12
d) a[0:3:2,:] =
1 2 3 4
9 10 11 12
a[(0,2,3),1:3] =
2 3 4
10 11 12
14 15 16

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