Eu sou novo na ciência da computação e já aprendi métodos básicos para integração, interpolação, métodos como RK4, Numerov etc. em c ++, mas recentemente meu professor me pediu para aprender a usar o LAPACK para resolver problemas relacionados a matrizes. Como, por exemplo, encontrar valores próprios de uma matriz complexa. Eu nunca usei bibliotecas de terceiros e quase sempre escrevo minhas próprias funções. Estou pesquisando há vários dias, mas não consigo encontrar nenhum guia para lapack para amadores. Todos eles estão escritos em palavras que não entendo e não sei por que o uso de funções já escritas deve ser tão complicado. Eles estão cheios de palavras como zgeev, dtrsv etc. e estou frustrado. Eu só quero codificar algo como este pseudo-código:
#include <lapack:matrix>
int main(){
LapackComplexMatrix A(n,n);
for...
for...
cin>>A(i,j);
cout<<LapackEigenValues(A);
return 0;
}
Não sei se estou sendo boba ou amadora. Mas, novamente, isso não deve ser tão difícil, deveria? Eu nem sei se devo usar o LAPACK ou LAPACK ++. (Eu escrevo códigos em c ++ e não tenho conhecimento de Python ou FORTRAN) e como instalá-los.
Respostas:
Discordo de algumas das outras respostas e digo que acredito que descobrir como usar o LAPACK é importante no campo da computação científica.
No entanto, há uma grande curva de aprendizado no uso do LAPACK. Isso ocorre porque está escrito em um nível muito baixo. A desvantagem disso é que parece muito enigmático e não agradável aos sentidos. A vantagem disso é que a interface é inequívoca e basicamente nunca muda. Além disso, as implementações do LAPACK, como a Intel Math Kernel Library, são realmente rápidas.
Para meus próprios propósitos, tenho minhas próprias classes C ++ de nível superior, que envolvem as sub-rotinas LAPACK. Muitas bibliotecas científicas também usam o LAPACK por baixo. Às vezes, é mais fácil usá-los, mas, na minha opinião, há muito valor na compreensão da ferramenta abaixo. Para esse fim, forneci um pequeno exemplo de trabalho escrito em C ++ usando LAPACK para você começar. Isso funciona no Ubuntu, com o
liblapack3
pacote instalado e outros pacotes necessários para a construção. Provavelmente pode ser usado na maioria das distribuições Linux, mas a instalação do LAPACK e a vinculação podem variar.Aqui está o arquivo
test_lapack.cpp
Isso pode ser construído usando a linha de comando
Isso produzirá um executável chamado
test_lapack
. Eu configurei isso para ler em um arquivo de entrada de texto. Aqui está um arquivo chamadomatrix.txt
contendo uma matriz 3x3.Para executar o programa, basta digitar
na linha de comando, e a saída deve ser
Comentários:
extern "C"
seção na parte superior e que adicionei um sublinhado adgeev_
. Isso ocorre porque a biblioteca foi escrita e construída no Fortran, portanto, é necessário fazer com que os símbolos correspondam ao vincular. Isso depende do compilador e do sistema; portanto, se você usá-lo no Windows, tudo terá que mudar.fonte
Normalmente, resisto a dizer às pessoas o que acho que elas deveriam fazer, em vez de responder à pergunta, mas, neste caso, vou abrir uma exceção.
Lapack é escrito em FORTRAN e a API é muito parecida com FORTRAN. Existe uma API C para o Lapack que torna a interface um pouco menos dolorosa, mas nunca será uma experiência agradável usar o Lapack do C ++.
Como alternativa, existe uma biblioteca de classes de matriz C ++ chamada Eigen que possui muitos dos recursos do Lapack, fornece desempenho computacional comparável às melhores implementações do Lapack e é muito conveniente de usar no C ++. Em particular, eis como seu código de exemplo pode ser escrito usando Eigen
Este exemplo de problema de autovalor é um caso de teste para a função Lapack
dgeev
. Você pode visualizar o código FORTRAN e os resultados desse exemplo de problema dgeev e fazer suas próprias comparações.fonte
operator,
! Nunca vi isso feito na prática :-)operator,
sobrecarga é mais interessante / melhor do que parece à primeira vista. É usado para inicializar matrizes. As entradas que inicializam a matriz podem ser constantes escalares, mas também podem ser matrizes ou sub-matrizes definidas anteriormente. Muito parecido com o MATLAB. Desejo a minha capacidade C ++ programação era bom o suficiente para implementar algo que sofisticado me ;-)Aqui está outra resposta na mesma linha que a anterior.
Você deve procurar na biblioteca de álgebra linear do Armadillo C ++ .
Prós:
DGESV
bobagem, apenasX = solve( A, B )
(embora haja uma razão por trás desses nomes de função LAPACK de aparência estranha ...).Veja como o código do @ BillGreene ficaria com o Tatu:
fonte