Ajude a manter o site livre, gratuito e sem propagandas. Colabore!
Vamos explorar a Eigen, biblioteca para computação matricial e tratamento numérico de dados. um software livre sob licença MPL2 e está disponível em https://eigen.tuxfamily.org/. A biblioteca é header-only, ou seja, não requer compilação e instalação. Para incluí-la em um código C++, basta adicionar o módulo eigen3/Eigen/Eigen no cabeçalho.
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.
Eigen::ArrayXXd
Objeto da classe dos arranjos bidimensionais de tamanho dinâmico e de elementos do tipo double.
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.
Eigen::RowVectorXd
Objetos da classe dos vetores linha de tamanho dinâmico e de elementos do tipo double.
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.
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.
Faça um código que aloque os vetores
(13) | |||
(14) |
e compute o vetor
Crie um código que aloque a matriz e o vetor
(15) | |||
(16) |
e compute o vetor
(17) |
para
Implemente uma função que computa o determinante de matrizes reais A
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.
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.
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.
Consulte mais sobre fatiamentos em Eigen::Slicing and Indexing.
Faça um código que aloque a matriz
(18) |
e imprima os seguintes fatiamentos:
A Eigen oferece operações matriciais como soma, subtração e multiplicação de matrizes pela sobrecarga dos operadores +, - e *, respectivamente.
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.
A multiplicação e divisão de matrizes e vetores por escalares é feita com os operadores * e /, respectivamente. Estudemos o seguinte código.
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.
Considere o seguinte sistema de equações lineares
(19) | ||||
(20) |
Escreva um código que aloque a matriz dos coeficientes
Considere o seguinte sistema de equações lineares
(21) | ||||
(22) | ||||
(23) |
Escreva um código que aloque a matriz dos coeficientes
Operações aritméticas elemento-a-elemento podem ser feitas com objetos da classe Eigen::Array (Eigen::ArrayXd e Eigen::ArrayXXd, por exemplo). Para matrizes é necessário usar o método array() para converter a matriz em um objeto do tipo Eigen::Array. Estudemos o seguinte código.
Consulte mais sobre operações elemento-a-elemento em Eigen::The Array class and coefficient-wise operations.
Faça um código para computar os valores da função cosseno aplicada ao vetor
(24) |
Considere que os seguintes objetos estão declarados declarados:
Antes de implementar para verificar, forneça o resultado, quando definido, de cada uma das seguintes operações:
arr - vec.array();
a.array() * vec;
a * vec;
a.row(0).array() * arr;
a.col(1) * vec;
a.col(1).array() * arr;
a)
A biblioteca Eigen conta com métodos para inicialização de matrizes e arranjos.
Zero()
Ones()
Constant()
Random()
Identity()
LinSpaced()
Considere as seguintes partições uniformes de intervalos
(25) | |||
(26) |
onde
Implemente uma função para computar a inverse de uma matriz não-singular pelo método de eliminação gaussiana. Verifique seu código com o método A.inverse() da Eigen.
Reduções são operações que transformam uma matriz ou um arranjo em um escalar.
sum()
prod()
mean()
minCoeff()/maxCoeff()
trace()
norm()
Faça um código que aloque os seguintes vetores
(28) | |||
(29) |
e compute a o produto interno (ou escalar)
Implemente uma função para computar o erro médio quadrático entre dois vetores u e v de mesmo tamanho. O erro médio quadrático é dado por
(30) |
A biblioteca Eigen contém a implementação de métodos de decomposição (LU, QR, SVD) que podem ser usadas para computar a solução de sistemas lineares
(31) | |||
(32) |
usando a o método da decomposição LU com pivotamento parcial.
Consulte mais sobre sistemas lineares em Eigen::Linear Algebra.
Considere o seguinte sistema de equações lineares
(33) | ||||
(34) | ||||
(35) |
Escreva um código que aloque a matriz dos coeficientes
Aproveito 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.
Ajude a manter o site livre, gratuito e sem propagandas. Colabore!
Vamos explorar a Eigen, biblioteca para computação matricial e tratamento numérico de dados. um software livre sob licença MPL2 e está disponível em https://eigen.tuxfamily.org/. A biblioteca é header-only, ou seja, não requer compilação e instalação. Para incluí-la em um código C++, basta adicionar o módulo eigen3/Eigen/Eigen no cabeçalho.
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.
Eigen::ArrayXXd
Objeto da classe dos arranjos bidimensionais de tamanho dinâmico e de elementos do tipo double.
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.
Eigen::RowVectorXd
Objetos da classe dos vetores linha de tamanho dinâmico e de elementos do tipo double.
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.
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.
Faça um código que aloque os vetores
(13) | |||
(14) |
e compute o vetor
Crie um código que aloque a matriz e o vetor
(15) | |||
(16) |
e compute o vetor
(17) |
para
Implemente uma função que computa o determinante de matrizes reais A
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.
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.
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.
Consulte mais sobre fatiamentos em Eigen::Slicing and Indexing.
Faça um código que aloque a matriz
(18) |
e imprima os seguintes fatiamentos:
A Eigen oferece operações matriciais como soma, subtração e multiplicação de matrizes pela sobrecarga dos operadores +, - e *, respectivamente.
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.
A multiplicação e divisão de matrizes e vetores por escalares é feita com os operadores * e /, respectivamente. Estudemos o seguinte código.
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.
Considere o seguinte sistema de equações lineares
(19) | ||||
(20) |
Escreva um código que aloque a matriz dos coeficientes
Considere o seguinte sistema de equações lineares
(21) | ||||
(22) | ||||
(23) |
Escreva um código que aloque a matriz dos coeficientes
Operações aritméticas elemento-a-elemento podem ser feitas com objetos da classe Eigen::Array (Eigen::ArrayXd e Eigen::ArrayXXd, por exemplo). Para matrizes é necessário usar o método array() para converter a matriz em um objeto do tipo Eigen::Array. Estudemos o seguinte código.
Consulte mais sobre operações elemento-a-elemento em Eigen::The Array class and coefficient-wise operations.
Faça um código para computar os valores da função cosseno aplicada ao vetor
(24) |
Considere que os seguintes objetos estão declarados declarados:
Antes de implementar para verificar, forneça o resultado, quando definido, de cada uma das seguintes operações:
arr - vec.array();
a.array() * vec;
a * vec;
a.row(0).array() * arr;
a.col(1) * vec;
a.col(1).array() * arr;
a)
A biblioteca Eigen conta com métodos para inicialização de matrizes e arranjos.
Zero()
Ones()
Constant()
Random()
Identity()
LinSpaced()
Considere as seguintes partições uniformes de intervalos
(25) | |||
(26) |
onde
Implemente uma função para computar a inverse de uma matriz não-singular pelo método de eliminação gaussiana. Verifique seu código com o método A.inverse() da Eigen.
Reduções são operações que transformam uma matriz ou um arranjo em um escalar.
sum()
prod()
mean()
minCoeff()/maxCoeff()
trace()
norm()
Faça um código que aloque os seguintes vetores
(28) | |||
(29) |
e compute a o produto interno (ou escalar)
Implemente uma função para computar o erro médio quadrático entre dois vetores u e v de mesmo tamanho. O erro médio quadrático é dado por
(30) |
A biblioteca Eigen contém a implementação de métodos de decomposição (LU, QR, SVD) que podem ser usadas para computar a solução de sistemas lineares
(31) | |||
(32) |
usando a o método da decomposição LU com pivotamento parcial.
Consulte mais sobre sistemas lineares em Eigen::Linear Algebra.
Considere o seguinte sistema de equações lineares
(33) | ||||
(34) | ||||
(35) |
Escreva um código que aloque a matriz dos coeficientes
Aproveito 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.