F # moving average


Ainda estou trabalhando em groking a coisa F - tentando descobrir como pensar em F ao invés de apenas traduzir de outras línguas que eu conheço. Ive recentemente foi pensando sobre os casos em que você não tem um mapa 1: 1 entre antes e depois. Casos em que o List. map cai. Um exemplo disto é as médias móveis, onde normalmente você terá len-n1 resultados para uma lista de comprimento len quando a média sobre n itens. Para os gurus lá fora, é esta uma boa maneira de fazê-lo (usando a fila presa de Jomo Fisher) (Talvez uma maneira melhor seria implementar um MovingAverageQueue por herdar de Fifo) perguntou Nov 17 08 às 11:12 Eu tinha que declarar Ele como deixar MovingAverage n (seqltfloatgt s), a fim de colocar isso em um módulo de utilitário, longe do site de chamada, para aplacar o sistema de tipo. Tanto quanto eu posso dizer, isso só funciona com flutuadores, devido a uma limitação de Array. average. MSDN alega que posso substituir isso por Array. averageBy para usar isso em uma sequência int, mas isso dá um erro diferente. Brian, você pode reformular essa resposta para trabalhar em contextos genéricos, de modo que ele irá trabalhar com tipo seq-of-any-arithmetic, sem inferência de tipo ndash Warren Young Jun 27 13 às 19:04 Eu devo salientar que a minha necessidade de Esta função de média móvel é obter uma janela curta (30ish) sobre uma seqüência de inteiros que são quase todos em milhões, então eu don39t necessidade de ponto flutuante. Mesmo um único dígito à direita do ponto decimal não tem utilidade prática na minha aplicação. Convertendo meus inteiros para FP eo resultado de volta para int apenas para aplacar a biblioteca padrão F doesn39t apelo. Se você se preocupa com o desempenho, então você pode calcular uma média móvel de forma eficiente usando algo como isto (supondo foram calcular uma média móvel em uma janela de 3 dias) A parte difícil sobre isso é segurando Em seu total de execução anterior e número N-janela. Eu vim com o seguinte código: Esta versão isnt tão agradável como o código Haskell, mas deve evitar problemas de desempenho associados com recomputing sua janela em cada executar. Ele mantém um total de execução e mantém números utilizados anteriormente em uma fila, por isso deve ser muito rápido. Apenas por diversão, eu escrevi um ponto de referência simples: Se você se importa com o desempenho e como código elegante, em seguida, tente Usando FSUnit podemos testá-lo O truque do algoritmo é a primeira soma os primeiros n números e, em seguida, manter um total rodando adicionando a cabeça Da janela e subtraindo a cauda da janela. A janela deslizante é conseguida fazendo um auto zip na seqüência mas com o segundo argumento para zip avançado pelo tamanho da janela. No final do pipeline, basta dividir o total de execução pelo tamanho da janela. Nota varredura é apenas como dobrar, mas rendimento cada versão do estado em uma seqüência. Uma solução ainda mais elegante, embora possivelmente com desempenho hit é fazer a observação de que se nós zero pad a seqüência não precisamos calcular a soma inicial. Poderia haver uma batida do desempenho devido ao segundo indirection relacionado ao envoltório das duas seqüências mas talvez não é significativo dependendo do tamanho da janela respondida agosto 31 12 em 8:06

Comments

Popular posts from this blog

Forex negociação cursos cape cidade comerciante novo comerciante rico como fazer dinheiro no mercado de ações livre fazer

Taxas de câmbio austrália

Prática conta para negociação on-line best binary option signals service