Melhor C ++ Matrix Biblioteca de matrizes unitárias esparsas
-
19-09-2019 - |
Pergunta
Eu estou procurando uma boa (no melhor dos casos mantido ativamente) C ++ matriz biblioteca. Assim, ele deve ser templated, porque eu quero usar um complexo de rationals como tipo numérica. As matrizes o que estou lidando com são principalmente escassa e unitária.
Você pode por favor sugerir bibliotecas e também dar uma pequena explicação por que usá-los, porque eu sei como encontrá-los, mas eu realmente não posso decidir o que é adequado para mim, porque eu estou em falta a experiência com eles.
EDIT:
As principais operações que estou lidando com são A multiplicação de matrizes , multiplicação escalar com um vector e produto de Kronecker . O tamanho das matrizes é exponencial e eu quero pelo menos ser capaz de lidar com matrizes de até 1024x1024 entradas.
Solução
Muitas pessoas fazendo "séria" material matriz, contam com BLAS , acrescentando LAPACK / ATLAS (matrizes normais) ou UMFPACK (esparsa matrizes) para a matemática mais avançada. A razão é que este código é bem testado, estável, confiável e muito rápido. Além disso, você pode comprá-los diretamente de um fornecedor (por exemplo Intel MKL ) sintonizado para a sua arquitetura, mas também obtê-los gratuitamente. uBLAS mencionado em a resposta de Manuel é provavelmente o padrão C ++ BLAS implementação. E se você precisa de algo como LAPACK mais tarde, há ligações a fazê-lo.
No entanto, nenhuma dessas bibliotecas padrão (BLAS / LAPACK / ATLAS ou uBLAS + ligações + LAPACK / ATLAS) carrapatos sua caixa para ser templated e fácil de usar (a menos que uBLAS é tudo que você precisará nunca). Na verdade, devo admitir, que eu tendem a chamar a interface C / Fortran diretamente quando eu usar uma implementação BLAS / LAPACK, já que muitas vezes eu não vejo muita vantagem adicional na combinação uBLAS + ligações.
Se eu uma necessidade de um uso simples de, de uso geral C ++ biblioteca de matriz, que tendem a usar Eigen (Eu costumava usar NEWMAT no passado) . Vantagens:
- bastante rápido na arquitetura Intel, provavelmente o mais rápido para matrizes menores
- interface agradável
- quase tudo que você espera de uma biblioteca de matriz
- você pode facilmente adicionar novos tipos
Desvantagens (IMO):
- single-processador [ Editar: parte fixa na Eigen 3,0 ]
- mais lento para as matrizes maiores e algum matemática avançada do que ATLAS ou Intel MKL (por exemplo decomposição LU) [
Editar: também melhorou em Eigen 3,0] - único suporte experimental para matrizes esparsas. [ Editar: melhorou em próxima versão 3.1]
Editar:. A próxima Eigen 3.1 permite algumas funções para usar o Intel MKL (ou quaisquer outros BLAS / implementação LAPACK)
Outras dicas
impulso , porque ele é passado o filtro Boost.
Existem algumas libs modelo que suportam matrizes esparsas, por isso é muito difícil chegar a uma melhor lógica se você não é mais específico sobre suas necessidades.