Alguém tem recomendações sobre uma biblioteca de matrizes C ++ rápida e utilizável?
O que quero dizer com utilizável é o seguinte:
- Os objetos de matriz têm uma interface intuitiva (por exemplo: eu posso usar linhas e colunas durante a indexação)
- Eu posso fazer qualquer coisa com a classe matrix que eu posso fazer com LAPACK e BLAS
- API fácil de aprender e usar
- É relativamente fácil de instalar no Linux (eu uso o Ubuntu 11.04 agora)
Para mim, a usabilidade é mais importante do que a velocidade ou o uso de memória no momento, para evitar a otimização prematura. Ao escrever o código, eu sempre poderia usar matrizes 1-D (ou vetores STL) e aritmética adequada de índice ou ponteiro para emular uma matriz, mas eu preferiria não fazer isso para evitar erros. Também gostaria de concentrar meu esforço mental no problema real que estou tentando resolver e programar no domínio do problema, em vez de usar parte da minha atenção finita para lembrar todos os pequenos truques de programação que usei para emular matrizes como matrizes e lembre-se dos comandos LAPACK, etc. Além disso, quanto menos código eu tenho que escrever, e quanto mais padronizado, melhor.
Denso versus escasso ainda não importa; algumas das matrizes com as quais estou lidando serão escassas, mas não todas. No entanto, se um pacote específico lida bem com matrizes densas ou esparsas, vale a pena mencionar.
A modelagem também não me interessa muito, pois trabalharei com tipos numéricos padrão e não preciso armazenar nada além de duplos, flutuadores ou ints. É legal, mas não é necessário para o que eu gostaria de fazer.
fonte
Respostas:
Reunimos o seguinte da pesquisa on-line até agora:
Eu usei o Armadillo um pouco e achei a interface bastante intuitiva, e foi fácil localizar pacotes binários para o Ubuntu (e estou assumindo outras distros do Linux). Não o compilei da fonte, mas minha esperança é que não seja muito difícil. Ele atende à maioria dos meus critérios de design e usa álgebra linear densa. Pode chamar rotinas LAPACK ou MKL. Geralmente, não é necessário compilar o Armadillo, é uma biblioteca puramente baseada em modelos: você apenas inclui o cabeçalho e o link para BLAS / LAPACK ou MKL etc.
Ouvi coisas boas sobre Eigen , mas não usei. Ele afirma ser rápido , usa modelagem e suporta álgebra linear densa. Ele não possui LAPACK ou BLAS como dependência, mas parece capaz de fazer tudo o que o LAPACK pode fazer (além de algumas coisas que o LAPACK não pode). Muitos projetos usam o Eigen, o que é promissor. Ele tem um pacote binário para o Ubuntu, mas como uma biblioteca somente de cabeçalho, é trivial usar também em outros lugares.
A versão 4 da Matrix Template Library também parece promissora e usa modelos. Ele suporta álgebra linear densa e esparsa e pode chamar UMFPACK como um solucionador esparso. Os recursos não são claros em seu site. Possui um pacote binário para o Ubuntu, disponível para download em seu site.
O PETSc , escrito por uma equipe do Laboratório Nacional de Argonne, tem acesso a solucionadores lineares esparsos e densos, por isso presumo que ele possa funcionar como uma biblioteca de matrizes. Está escrito em C, mas acho que possui ligações C ++ (e mesmo que não tenha, chamar C em C ++ não é problema). A documentação é incrivelmente completa. O pacote é um pouco exagerado para o que eu quero fazer agora (multiplicação e indexação de matrizes para configurar programas lineares com números inteiros mistos), mas pode ser útil como um formato de matriz para mim no futuro ou para outras pessoas com necessidades diferentes do que eu.
O Trilinos , escrito por uma equipe do Sandia National Laboratory, fornece interfaces C ++ orientadas a objetos para matrizes densas e esparsas através de seu componente Epetra e interfaces modeladas para matrizes densas e esparsas através de seu componente Tpetra. Ele também possui componentes que fornecem a funcionalidade linear de resolução e eigensolver. A documentação não parece ser tão polida ou proeminente quanto o PETSc; Trilinos parece o análogo Sandia do PETSc. O PETSc pode chamar alguns dos solucionadores de Trilinos. Binários para Trilinos estão disponíveis para Linux.
O Blitz é uma biblioteca orientada a objetos C ++ que possui binários Linux. Ele não parece ser mantido ativamente (29/06/2012: uma nova versão apareceu ontem!), Embora a lista de emails esteja ativa, há uma comunidade que a usa. Parece não fazer muito em termos de álgebra linear numérica além do BLAS e parece uma biblioteca de matrizes densa. Ele usa modelos.
Boost :: uBLAS é uma biblioteca orientada a objetos C ++ e parte do projeto Boost. Ele suporta álgebra linear numérica densa e de modelos. Ouvi dizer que não é particularmente rápido.
O Template Numerical Toolkit é uma biblioteca orientada a objetos C ++ desenvolvida pelo NIST. Seu autor, Roldan Pozo, parece contribuir com patches ocasionalmente, mas não parece mais estar em desenvolvimento ativo (a última atualização foi em 2010). Ele se concentra na álgebra linear densa e fornece interfaces para algumas decomposições básicas da matriz e um solucionador de autovalores.
Elemental , desenvolvido por Jack Poulson, é um pacote de software de álgebra linear denso de memória distribuída (paralela) escrito em um estilo semelhante ao FLAME . Para uma lista de recursos e antecedentes do projeto, consulte a documentação dele . O próprio FLAME possui uma biblioteca associada para álgebra linear densa de memória compartilhada e seqüencial, chamada libflame , que parece ser escrita em C. orientada a objetos. Libflame se parece muito com LAPACK, mas com uma melhor notação subjacente aos algoritmos para desenvolver o desenvolvimento numérico rápido bibliotecas de álgebra linear mais de uma ciência e menos de uma arte negra.
Existem outras bibliotecas que podem ser adicionadas à lista; se estivermos contando pacotes de álgebra linear esparsos como "bibliotecas matriciais", o melhor gratuito que conheço em C é o SuiteSparse , programado no estilo orientado a objetos. Eu usei o SuiteSparse e achei bastante fácil de pegar; depende de BLAS e LAPACK para alguns dos algoritmos que decompõem problemas esparsos em muitos subproblemas pequenos e densos de álgebra linear. O principal autor do pacote, Tim Davis, é incrivelmente útil e um ótimo cara.
As bibliotecas de sub-rotinas Harwell são famosas por suas rotinas esparsas de álgebra linear e são gratuitas para usuários acadêmicos, embora você precise passar por esse processo de preenchimento de um formulário e de receber um e-mail para cada arquivo que deseja baixar. Como as sub-rotinas geralmente têm dependências, o uso de um solucionador pode exigir o download de cinco ou seis arquivos, e o processo pode ser entediante, principalmente porque a aprovação do formulário não é instantânea.
Também existem outros solucionadores de álgebra linear esparsos, mas até onde eu sei, o MUMPS e outros pacotes estão focados principalmente na solução de sistemas lineares, e resolver sistemas lineares é a menor das minhas preocupações no momento. (Talvez mais tarde, precisarei dessa funcionalidade e poderá ser útil para outras pessoas.)
fonte
Este documento foi escrito em março de 2009 para ajudar na escolha de uma biblioteca de álgebra linear para uma biblioteca científica. Avalia a portabilidade, a interface de alto nível e o licenciamento de diversas bibliotecas, entre elas Eigen, GSL, Lapack ++ MTL, PETSc, Trilinos e uBlas. Parece gostar particularmente de Flens e Seldon . (Um dos requisitos era o suporte a modelos C ++ e matrizes esparsas.)
fonte
De todos os projetos listados acima, existem realmente apenas dois pesos pesados que são extremamente amplamente utilizados (e por boas razões): PETSc e Trilinos. Ambos são desenvolvidos profissionalmente e têm uma grande base de desenvolvedores. Todos os outros são projetos relativamente pequenos em comparação com esses dois, e eu recomendaria acompanhá-los porque (i) eles serão suportados por muito tempo e (ii) provavelmente já terão todas as funcionalidades que você precisará em relação a álgebra linear (e muito mais além disso).
fonte
Se você quiser
Então eu recomendo que você dê uma olhada na minha biblioteca FLENS . Eu o projetei exatamente para esse tipo de tarefa. No entanto, requer um compilador em conformidade com C ++ 11 (por exemplo, gcc 4.7 ou clang).
O FLENS oferece exatamente o mesmo desempenho que a implementação BLAS subjacente. Existem alguns benchmarks (bastante antigos) mostrando isso
O mesmo pode ser dito sobre o FLENS-LAPACK, que oferece exatamente o mesmo desempenho que o LAPACK do Netlib, se a mesma implementação do BLAS for usada.
Em relação aos novos benchmarks, deixe-me entrar em mais detalhes ...
Algum tempo atrás, perguntei a Clint Whaley (o autor do ATLAS) o que ele pensa sobre os benchmarks publicados no site da Eigen. Ele acabou de confirmar meu suspeito de que esses parâmetros de referência provavelmente não são confiáveis. Enquanto isso, alguns outros realizaram benchmarks da maneira que Clint sugeria. Detalhes podem ser encontrados no site ATLAS e na lista de distribuição Eigen. Os benchmarks não são bem apresentados em gráficos, mas mostram que o ATLAS é sempre cerca de 40% mais rápido que o Eigen. Isso contradiz os benchmarks do site Eigen, mas confirma outros benchmarks (por exemplo, aqueles do blaze-lib).
Observe que, para álgebra linear numérica densa, os produtos matriz-matriz são mais relevantes. Pessoalmente, não me importo se Eigen ou ATLAS é mais rápido. Se o Eigen fosse mais rápido que o ATLAS, eu o usaria como back-end do BLAS.
Disclaimer: Sim, FLENS é meu bebê! Isso significa que codifiquei cerca de 95% e todas as linhas de código valeram a pena :-)
fonte
Uso o GMM ++ há algum tempo e estou feliz com isso.
fonte
Basicamente, a mesma pergunta surgiu no SO:
Quais são as bibliotecas de álgebra linear vetorial / matriz matemática / linear C ++ mais usadas, e suas vantagens e desvantagens em custos e benefícios?
(Agrega algum valor à resposta de Geoff.)
fonte
Qual seria a melhor biblioteca de matrizes para lidar com matrizes de tamanho pequeno, que são comumente usadas, por exemplo, ao montar matrizes de elementos finitos, para executar operações de tensores e assim por diante.
Eu já estou usando o PETSc para a solução dos grandes sistemas lineares esparsos que surgem no meu aplicativo, mas atualmente estou usando minha própria biblioteca simples para lidar com essas matrizes / vetores ... Estou pensando em mudar para uma biblioteca mais rápida como os mencionados acima.
Qual seria a melhor escolha para se juntar ao PETSc? Eigen? Tatu? IMPULSO :: uBlas? MTL4? Eu uso algumas coisas do BOOST, então, primeiro pensei em usar o BOOST :: uBlas, mas não há muita documentação, exemplos e assim por diante ...
fonte
Armadillo, Boost e outros agora incluídos como parte do Ceemple, um ambiente rápido de computação técnica em C ++ baseado em JIT. Disponível (gratuito) em http://www.ceemple.com .
fonte
Surpreendido, ninguém mencionou TooN até agora. Felizmente, usá-lo há quase 3 anos.
É muito semelhante ao Eigen, embora não seja tão abrangente. No entanto, acho que tem a melhor sintaxe de algumas maneiras.
Ele também vem com classes que ajudam a modelar transformações comuns que são frequentemente encontradas em Gráficos e Visão, baseadas em Grupos de Mentiras (Euclidiano Especial / Ortogonal em 2 e 3 dimensões, etc.) e Álgebras de Mentiras associadas.
fonte
Biblioteca HASEM Matrix C ++ é o que você realmente precisa http://sourceforge.net/projects/hasem/
fonte