Saturday, 4 November 2017

Moving Average C Sharp


Para obter um desempenho assintotico de O n como a soluo codificada manualmente, pode-se usar a funo Aggregate como in. O valor acumulado implementado como tipo anonimo contém dois campos Result contém a compilação de lista de resultados até agora O trabalho contém o último Período-1 elementos A função agregada adiciona o valor atual para a lista de trabalho, constrói a média atual e adiciona-o ao resultado e, em seguida, remove o primeiro ou seja, mais antigo valor da lista de trabalho. A semente ou seja, o valor inicial para a acumulação é construir Colocando os primeiros elementos do período-1 no trabalho e inicializando o resultado em uma lista vazia. Conseqüentemente a agregação começa com o período do elemento saltando os elementos do período-1 no início. Na programação funcional isto é um padrão de uso típico para a função do aggretate ou da dobra , Btw. The solução não é funcionalmente limpo em que a mesma lista de objetos de trabalho e de resultados são reutilizados em cada etapa eu não tenho certeza se isso pode causar problemas, se assim for Me futuros compiladores tentam paralelizar a função de agregação automaticamente, por outro lado Eu também não tenho certeza, se isso é possível depois de tudo Uma solução puramente funcional deve criar novas listas em cada etapa. Também observe que C carece de poderosas expressões de lista Em alguns hipotéticos Python - C-pseudocode misturado poderia escrever a função de agregação like. which seria um pouco mais elegante na minha opinião humble. Note o tempo de execução de O n 2, uma vez que você precisa ignorar mais e mais elementos em cada etapa e afaik Skip i tem Para chamar i times Veja a minha resposta para uma solução em O n tempo eu só notei o comentário OPs abaixo que ele, ela possivelmente irá obter os valores de um SQL DB no futuro Neste caso, eu iria cada fortemente desencorajar a partir desta solução MartinStettner Mar 3 11 at 0 53.Para a maneira mais eficiente possível calcular uma média móvel com LINQ, você não deve usar LINQ. Em vez disso, proponho a criação de uma classe auxiliar que calcula uma média móvel da maneira mais eficiente possível usando ac Buffer ircular e filtro de média móvel causal, em seguida, um método de extensão para torná-lo acessível para LINQ. Primeiro acima, a média móvel. Esta classe fornece uma implementação muito rápida e leve de um filtro MovingAverage Ele cria um buffer circular de Comprimento N e calcula um Add, uma subtração e uma multiplicação por ponto de dados anexado, em oposição à N multiplicar-adiciona por ponto para a implementação da força bruta. Os métodos de extensão acima envolvem a classe MovingAverage e permitem a inserção em um fluxo IEnumerable. Para fazer isso em um De forma mais funcional, você precisa de um método de digitalização que existe no Rx, mas não no LINQ. Vamos olhar como seria se tivéssemos um método de digitalização. E aqui está o método de digitalização, tirado e ajustado a partir daqui. Têm melhor desempenho do que o método de força bruta desde que estamos usando um total de corrida para calcular o SMA. Para começar, precisamos calcular o primeiro período que chamamos de semente aqui Então, cada valor subsequente que calculamos a partir da s Para fazer isso precisamos do valor antigo que é t-delta eo valor mais novo para o qual nós fechamos juntos a série, uma vez desde o início e uma vez deslocado pelo delta. No final, fazemos algumas limpezas adicionando zeros para o comprimento Do primeiro período e adicionando o valor de semente inicial. Se o desempenho deste código é crítico, então poderia fazer sentido para evitar alocações de pilha para Candle s eu acho que a maneira mais razoável de fazer isso seria Fazer Candle em uma struct. Though tipos de valores mutable são mal assim que eu também refatorar Candle para ser imutável Isso também significa que a implementação de newestCandle teria que mudar, provavelmente em um par de campos duplos ou, alternativamente, uma classe mutable e resettable separado. Eu não vejo qualquer outro problema potencial de desempenho em seu código Mas quando se trata de desempenho, você deve sempre confiar em perfis, não o seu intuition. Also ou outra pessoa. Também, eu não gosto de alguns nomes de seus métodos Método Specifically. ValueUpdated Nam Es normalmente deveria estar na forma de fazer algo, não algo aconteceu Então eu acho que um nome melhor seria UpdateValue. Add Modificar Estas são as duas operações fundamentais do seu MovingAverage e eu acho que esses nomes don t expressar o significado bem Eu chamaria de Algo como MoveAndSetCurrent e SetCurrent, respectivamente Embora tal nomeação indica que as operações fundamentais devem ser bastante Move e SetCurrent. I tem uma quantidade de 4000 dados de estoque e tring para calcular a média móvel para todos os valores de dados, mas desde que a média móvel é baseada em Dados anteriores e eu não posso calcular o SMA de 15 dias para os primeiros 14 dias, ignorar os primeiros 14 dias e calcular o SMA sobre o resto dos dados E ele tem que estar usando o LINQ para realizar Alguém pode dar uma amostra ou dica como Para usar LINQ para calcular a média móvel A saída para os valores médios são todos em torno de 500 si realmente não entendo como é que é possível obter esse alto valor. Moving média com somas array.06 07 2012 562 49 571 72,06 08 2012 565 84 580 32,06 11 2012 568 56 571 17,06 12 2012 569 55 576 16,06 13 2012 570 56 572 16,06 14 2012 570 63 571 53,06 15 2012 571 21 574 13,06 18 2012 572 78 585 78,06 19 2012 573 79 587 41,06 20 2012 574 23 585 74,06 21 2012 574 22 577 67,06 22 2012 575 63 582 10,06 25 2012 576 06 570 77,06 26 2012 576 68 572 03,06 27 2012 576 88 574 50,06 28 2012 576 7 569 05,06 29 2012 576 95 584 00.07 02 2012 578 37 592 52.07 03 2012 579 92 599 41.07 03 2012 581 74 599 41.Editado por Leemx Sexta-feira, 16 de novembro de 2012 2 59 AM. Movido por Lisa Zhu Equipe de contingentes da Microsoft Monday, November 19, 2012 7 38 AM linq Relacionado a partir de Visual C General. Friday, 16 de novembro de 2012 2 42 AM. Para criar uma média móvel, gostaria de começar por criar um intervalo de 0 a comprimento da lista de dados - duração do período de movimento, em seguida, para cada valor no intervalo de seleção Elementos x para x comprimento do período em movimento e calcular a média. Tudo em uma declaração agradável LINQ. Note que isso não é extremamente eficiente, uma vez que você Basicamente iterar sobre a lista de dados para cada valor na faixa. Hey, olhar Este sistema permite assinaturas de mais de 60 cha. Edited by Arno Brouwer sexta-feira, novembro 23, 2012 4 42 PM. Marked como resposta por Alexander Sun sexta-feira, 07 de dezembro , 2012 2 44 AM. Friday, 23 de novembro de 2012 4 41 PM. All respostas. Uma amostra de sua declaração LINQ seria help. Premature otimização é a raiz de todos os mal - Knuth. Para criar uma média móvel, gostaria de começar por criar Um intervalo de 0 a comprimento da lista de dados - comprimento do período em movimento, em seguida, para cada valor na faixa selecionar elementos x para x comprimento do período em movimento e calcular a média. Todos em uma declaração agradável LINQ. Note que isso não é extremamente eficiente , Uma vez que basicamente iterar sobre a lista de dados para cada valor no intervalo. Hey, olhar Este sistema permite assinaturas de mais de 60 cha. Editado por Arno Brouwer sexta-feira, novembro 23, 2012 4 42 PM. Marked como resposta por Alexander Sun sexta-feira , 07 de dezembro de 2012 2 44 AM. Friday, 23 de novembro de 2012 4 41 PM. Microsoft Está conduzindo uma pesquisa on-line para entender sua opinião sobre o site da Msdn Se você optar por participar, a pesquisa on-line será apresentada a você quando você deixar o site da Msdn. Would você gosta de participar. Ajudar-nos a melhorar MSDN. Visit nosso UserVoice Página para enviar e votar em ideas. Dev centers. Learning recursos.

No comments:

Post a Comment