Tuesday 20 August 2019

C moving average algorithm


Eu sei que isso é viável com o impulso 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 números 1000 mais recentes como uma amostra de dados. Qual é a maneira mais fácil de conseguir 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 correspondiam melhor às 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, conforme 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ê só precisa encontrar um valor de alfa onde o efeito de uma determinada amostra dura apenas cerca de 1000 amostras. Hmmm, na verdade, não tenho certeza de que isso é adequado para você, agora que eu 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. Então isso permite que ele seja usado para calcular médias base de tempo (por exemplo, bytes por segundo). Se o tempo decorrido desde a última atualização do acumulador for superior a 1 segundo, você deixa alfa ser 1.0. Caso contrário, você pode deixar o alfa ser (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 amostra de dados. Observe que as atualizações abaixo atualizam o total como elementos como adicionados substituídos, evitando a passagem O (N) dispendiosa para calcular a soma - necessária para a demanda média. 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 adicional de dados do bool para gravar quando o recipiente é preenchido pela primeira vez ao andar de bicicleta numsamples em torno da matriz (o melhor que renomeou 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 visto. 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 Não estou certo da solução correta, porém, uma vez que a soma da média de cada amostra introduziria uma quantidade razoável de erro de arredondamento. Hmm. Eu me pergunto se separar a parte fracionária de toda a parte ajudaria. Divida toda a parte de cada número pela contagem. Mantenha três somas correntes: 1) A média das partes inteiras, 2) O restante de cada divisão, e 3) A parte fracionada de cada número. Cada vez que a parte inteira de um número é dividida, o resultado da peça inteira é adicionado à soma de execução média e o restante é adicionado ao restante da soma de execução. Quando a soma de execução restante obtém um valor maior ou igual à contagem, é dividido pela contagem com o resultado da parte inteira adicionado à soma de execução média e o restante adicionado à soma de execução restante. Além disso, em cada cálculo, a parte fracionada é adicionada à soma de rotura fracionada. Quando a média é concluída, a soma de execução restante é dividida pela contagem e o resultado é adicionado à soma de execução média como um número flutuante. Por exemplo: agora o que fazer com a soma de execução fracionada. O perigo de transbordar é muito menos provável aqui, embora ainda seja possível, de modo que uma maneira de lidar com isso seria dividir a soma de execução fracionada pela contagem no final e adicioná-la ao nosso resultado: uma alternativa seria verificar a operação fracionada Somar em cada cálculo para ver se é maior ou igual a contar. Quando isso acontece, faça o mesmo que fazemos com a soma de execução restante. Excelente Jomit Vaghela 6-Mar-07 21:00 Eu gostei do que você disse que os pequenos empregos rapidamente se transformam em grandes empregos. Pensar na otimização enquanto a codificação é uma boa prática. Grande esforço e explicação,

No comments:

Post a Comment