Circular mover média


Aqui está uma sugestão completamente diferente - eu estava tentando realmente torná-lo melhor, em vez de mais legível. O problema com seu código atual é que ele resume muitos números novamente e novamente, quando não é realmente necessário. Comparando ambas as abordagens após o código de implementação. Eu apenas soma um bando pela primeira vez, e depois restando a cauda e adicionando a cabeça, novamente e novamente: E aqui estão os testes de velocidade, comparando a abordagem de recálculo completo contra esta: Uma vez que Foo1 é O (nm) e Foo2 é O (nm) é realmente não surpreendente que a diferença seja enorme. Os resultados nesta escala não realmente louca são: Os resultados são iguais: True Foo1: 5.52 segundos Foo2: 61.1 milissegundos E em uma escala maior (substituiu 1000 com 10000 em ambas as iterações e contagem): Foo1: Parou após 10 minutos. Foo2: 6,9 segundos. Eu sei que isso é viável com o aumento de acordo com: Mas eu realmente gostaria de evitar o uso de impulso. Eu mencionei e não encontrei nenhum exemplo adequado ou legível. Basicamente eu quero acompanhar a média móvel de um fluxo contínuo de um fluxo de números de ponto flutuante usando os 1000 números mais recentes como amostra de dados. Qual é a maneira mais fácil de alcançar isso, experimentei usar uma matriz circular, uma média móvel exponencial e uma média móvel mais simples e descobriu que os resultados da matriz circular adequavam minhas necessidades. 12 de junho 12 às 4:38 Se suas necessidades são simples, você pode tentar usar uma média móvel exponencial. Simplificando, você faz uma variável de acumulador e, à medida que seu código examina cada amostra, o código atualiza o acumulador com o novo valor. Você escolhe um alfa constante que está entre 0 e 1 e calcula isso: você precisa apenas encontrar um valor de alfa onde o efeito de uma determinada amostra dura apenas cerca de 1000 amostras. Hmm, na verdade, não tenho certeza de que isso é adequado para você, agora que eu já coloquei aqui. O problema é que 1000 é uma janela bastante longa para uma média móvel exponencial. Não tenho certeza se houver um alfa que espalhe a média nos últimos 1000 números, sem fluxo inferior no cálculo do ponto flutuante. Mas se você quisesse uma média menor, como 30 números ou mais, esta é uma maneira muito fácil e rápida de fazê-lo. Respondeu 12 de junho 12 às 4:44 1 na sua postagem. A média móvel exponencial pode permitir que o alfa seja variável. Assim, isso permite que ele seja usado para calcular médias base de tempo (por exemplo, bytes por segundo). Se o tempo desde a última atualização do acumulador for superior a 1 segundo, você deixa alfa ser 1.0. Caso contrário, você pode deixar alpha be (usecs desde a última atualização1000000). Ndash jxh 12 de junho 12 às 6:21 Basicamente eu quero acompanhar a média móvel de um fluxo contínuo de um fluxo de números de ponto flutuante usando os 1000 números mais recentes como uma amostra de dados. Observe que as atualizações abaixo atualizam o total como elementos como adicionados, evitando a trajetória O (N) cara para calcular a soma - necessária para a média - na demanda. Total é feito um parâmetro diferente de T para suportar, e. Usando um longo tempo quando totalizando 1000 long s, um int para char s, ou um duplo para float total s. Isso é um pouco falho em que numsamples poderia ultrapassar o INTMAX - se você se importar, você poderia usar um sinal não assinado por muito tempo. Ou use um membro extra de dados do bool para gravar quando o recipiente é preenchido pela primeira vez ao andar de bicicleta numsamples em torno da matriz (melhor então renomeado algo inócuo como pos). Respondeu 12 de junho 12 às 5:19 um assume que quotvoid operator (T sample) quot é realmente quotvoid operatorltlt (T sample) quot. Ndash oPless Jun 8 14 às 11:52 oPless ahhh. Bem manchado. Na verdade, eu quis dizer que ele seria um operador vazio () (amostra T), mas é claro que você poderia usar qualquer notação que você gostasse. Vou consertar, obrigado. Ndash Tony D 8 de junho 14 às 14: 27 Eu tenho uma quantidade de 4000 dados de estoque e tring para calcular a média móvel para todos os valores de dados, mas como a média móvel é baseada em dados anteriores e não consigo calcular o SMA de 15 dias para Nos primeiros 14 dias, salte os primeiros 14 dias e calcule o SMA no resto dos dados. E tem que estar usando LINQ para realizar. Alguém pode dar uma amostra ou sugerir como usar o LINQ para calcular a média móvel. A saída para os valores médios é de cerca de 500, eu realmente não entendo como é possível obter esse valor alto. Movendo averager com matriz somas: 06072017 562,49 571,72 06082017 565,84 580,32 06112017 568,56 571,17 06122017 569,55 576,16 06132017 570,56 572,16 06142017 570,63 571,53 06152017 571,21 574,13 06182017 572,78 585,78 06192017 573,79 587,41 06202017 574,23 585,74 06212017 574,22 577,67 06222017 575,63 582,10 06252017 576,06 570,77 06262017 576,68 572,03 06272017 576,88 574,50 06282017 576,7 569,05 06292017 576,95 584,00 07022017 578,37 592,52 07032017 579,92 599,41 07032017 581,74 599,41 Editado por Leemx sexta-feira, 16 de novembro de 2017 2:59 Movido por Lisa Zhu Equipe de contingentes da Microsoft segunda-feira, 19 de novembro de 2017 7:38 linq related (From : Visual C General) Sexta-feira, 16 de novembro de 2017 2:42 AM Para criar uma média móvel, eu começaria por criar um intervalo de 0 a (comprimento da lista de dados - comprimento do período de movimento), então para cada valor no intervalo Selecione elementos x a x 43 comprimento do período de movimento e calcule a média. Tudo em uma boa declaração do LINQ: note que isso não é extremamente eficiente, já que você basicamente itera sobre a lista de dados por cada valor no intervalo .. Ei, veja Este sistema permite assinaturas de mais de 60 cha Editado por Arno Brouwer sexta-feira, novembro 23, 2017 4:42 PM Marcado como resposta por Alexander Sun sexta-feira, 7 de dezembro de 2017 2:44 am sexta-feira, 23 de novembro de 2017 16:41 Todas as respostas Uma amostra da sua declaração LINQ ajudaria. Otimização do tempo é a raiz de todo o mal. Knuth Para criar uma média móvel, eu começaria por criar um intervalo de 0 a (comprimento da lista de dados - comprimento do período de movimento), então, para cada valor no intervalo, selecione os elementos x Para x 43 comprimento do período de movimento e calcular a média. Tudo em uma boa declaração do LINQ: note que isso não é extremamente eficiente, já que você basicamente itera sobre a lista de dados por cada valor no intervalo .. Ei, veja Este sistema permite assinaturas de mais de 60 cha Editado por Arno Brouwer sexta-feira, novembro 23, 2017 4:42 PM Marcado como resposta por Alexander Sun sexta-feira, 7 de dezembro de 2017 2:44 am Sexta-feira, 23 de novembro de 2017 16:41 A Microsoft está realizando 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 quando você deixar o site Msdn. Você gostaria de participar? Ajude-nos a melhorar o MSDN. Visite a nossa página UserVoice para enviar e votar ideias Centros Dev Recursos de aprendizagem

Comments