Pergunta

O que é uma representação bom para matrizes em Clojure? Estou interessado em lidar com matrizes densas de números de ponto flutuante. A "lista de listas" molas de representação à mente, mas há algo melhor?

Alguns critérios para uma boa representação incluem:

  • Eficiência:. Eles não serão usados ??para o processamento constante de grandes conjuntos de dados, mas eu não quero passar horas cálculo resultados que poderiam ter sido feitas em minutos com um projeto melhor
  • Java interoperabilidade:. Seria bom para passar a parte de trás de dados e para trás entre as duas línguas facilmente
  • Fácil paralelização:. Se eu puder usar todos os núcleos disponíveis simplesmente substituindo map com pmap, que seria bom
  • propícios ao uso de reduce:. Parece que muitos dos cálculos que estou fazendo um trabalho muito bem com reduce
  • Capacidade de representar a imagem Linhas de digitalização em linhas da matriz: Não. Muito importante, mas seria bom ter

Qualquer pensamento?

Foi útil?

Solução

Incanter fornece um invólucro em torno de alguns Parallel Colt , incluindo o que parece ser uma implementação decente de rápido, parallelized matrizes densas que fazem interface com bibliotecas baseadas em seq do Clojure. Eu não tê-lo usado, mas deve ser o que você está procurando.

Exemplo .

Outras dicas

Eu estou escrevendo uma biblioteca de embrulho matriz jblas chamado, provisoriamente, Clatrix. Está faltando um monte de recursos que ainda deseja adicionar, mas tem mais do que você pode estar procurando. Dê uma olhada, http://github.com/tel/clatrix .

Confira a proposta core.matrix + implementação experimental aqui:

https://github.com/mikera/matrix-api

dias muito iniciais no momento da escrita, mas vale a pena manter um olho em.

No momento, estou usando a lista de listas de abordar em cryptovide porque é muito importante para esta aplicação para manter as coisas preguiçoso . Também estou pensando em mudar para uma abordagem mais eficiente, desde que mantido pelo menos a representação externa preguiçoso.

Clojure de Rich Hickey é um Lisp baseado em JVM que representa PersistentVector (não um PersistentList) com uma árvore de 32 vias.

Se você gostaria de escrever seu próprio tipo de matriz i usaria PersistentVector caso contrário, a melhor opção é usar Colt paralelo com Incanter.

Eu escrevi recentemente um código que matemática matriz necessários, e, inicialmente, eu usei vector-de-vetores, mapear e reduzir, mas não encontrou o código resultante difícil de entender quando voltei para ele (eu sou novo à mente Clojure). Incanter fez o mesmo código muito concisa, fácil de entender (ops matriz padrão) e muito, muito mais rápido.

as respostas podem precisar ser atualizado como 8 anos passados. A rápida mostra google busca que se você precisa ser compatível com Clojure core.matrix API, você pode usar-se core.matrix ou outras implementações como vectorz-CLJ.

Além disso eu descobri neandertalense que é optimizado para GPU

Não sou especialista, mas aqui é a minha opinião de qualquer maneira:)

lista-de-lista é provavelmente a linguagem Clojure natural mais para representar matrizes. Essa estrutura também se presta muito bem para mapear / reduzir os tipos de operações. Clojure também é muito eficiente em seqüências de manipulação -. Provavelmente melhor do que a maioria das alternativas

Eu não posso jurar isso, mas eu acho que eu vi Clojure trabalhar 3 ou todos os 4 dos meus CPUs rígidos sobre os programas que eu escrevi que eram funcionais em grande estilo, mas não fez qualquer tentativa de ser paralelas. Eu suspeito que o compilador é encontrar algumas oportunidades de processamento paralelo em sua própria.

Eu acho que os tipos de seqüência criados por Clojure funcionará como listas em Java, ou pelo menos ser Iterable. Isso é provavelmente bom o suficiente para o que você quer, mas você pode ter problemas se você tentar tratar essas estruturas como modificável em Java.

As listas são melhor acessados ??sequencialmente. Se você está planejando para pular muito na matriz, um vetor de-vetores pode servi-lo um pouco melhor, em termos de performance. Eu suspeito que bate usando o função enésimo.

Como ex-programador C, eu brevemente considerado que você poderia implementar sua matriz como um one-dimensional estrutura (ou seja, uma seqüência em linha reta ou melhor um vetor), e fazer seus próprios cálculos de índice para encontrar o elemento certo. Você pode usar o partição função a passo através dele ... bem, isso poderia ser feito para o trabalho, mas eu suspeito que há muito boas razões para não.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top