Moving average nan


Uma das principais aplicações para a placa Arduino é a leitura e registro de dados de sensores. Por exemplo, um monitora a pressão a cada segundo do dia. Como altas taxas de amostragem geralmente gera picos nos gráficos, também se deseja ter uma média das medições. Como as medições não são estáticas no tempo o que muitas vezes precisamos é de uma média de corrida. Esta é a média de um determinado período e muito valioso quando se faz análise de tendências. A forma mais simples de uma média em execução pode ser feita por um código que se baseia na média anterior: Se não se deseja usar matemática em ponto flutuante - como isso ocupa a memória e diminui a velocidade - pode-se fazer o mesmo completamente no domínio inteiro. A divisão por 256 no código de exemplo é um deslocamento-direito 8, que é mais rápido do que digamos divisão por, e. 100. Isso é verdade para cada poder de 2 como divisor e um só deve ter cuidado a soma dos pesos é igual ao poder de 2. E, claro, deve-se tomar cuidado não há transbordamento intermediário (considere usar unsigned longo) Se você precisar Uma média de execução mais precisa, in concreto das últimas 10 medições, você precisa de uma matriz (ou lista vinculada) para mantê-los. Esta matriz age como um buffer circular e com cada nova medição a mais antiga é removida. A média de execução é calculada como a soma de todos os elementos divididos pelo número de elementos na matriz. O código para a média em execução será algo como isto: Desvantagem deste código é que a matriz para armazenar todos os valores pode se tornar bastante grande. Se você tem uma medição por segundo e você quer uma média de execução por minuto que você precisa de uma matriz de 60 uma média por hora precisaria de uma matriz de 3600. Isso não poderia ser feito desta maneira em um Arduino como ele só tem 2K de RAM. No entanto, através da construção de uma média de 2 estágios que pode ser abordado muito bem (renúncia: não para todas as medições). No código psuedo: Como uma nova matriz estática interna é necessária para cada função runningAverage, isso grita para ser implementado como uma classe. Biblioteca RunningAverage A biblioteca runningAverage cria uma classe da função acima para que ela possa ser usada várias vezes em um sketch. Desacopla a função add () e avg () para ser um pouco mais flexível, e. Um pode chamar a média várias vezes sem adicionar uma coisa. Observe que cada instância da classe adiciona sua própria matriz para realizar medições e que isso adiciona até o uso de memória. A interface da classe é mantida o menor possível. Nota: com a versão 0.2 os nomes dos métodos são todos mais descritivos. Um pequeno esboço mostra como ele pode ser usado. Um gerador aleatório é usado para imitar um sensor. Em setup () o myRA é limpo para que possamos começar a adicionar novos dados. Em loop () primeiro um número aleatório é gerado e convertido em um flutuador a ser adicionado ao myRA. Em seguida, o runningAverage é impresso para a porta serial. Pode-se também exibi-lo em algum LCD ou enviar mais ethernet etc Quando 300 itens são adicionados myRA é limpo para começar de novo. Para usar a biblioteca, crie uma pasta em seu SKETCHBOOKPATHlibaries com o nome RunningAverage e coloque o. h e. cpp lá. Opcionalmente, faça um subdiretório de exemplos para colocar o aplicativo de exemplo. 2017-01-30: versão inicial 2017-02-28: corrigido destrutor em falta no arquivo. h 2017-02-28: construtor padrão removido 2017--. Adicionado fillValue () refactored para publicação 2017-07-03: adicionado código de proteção de memória - se matriz interna não pode ser alocada tamanho Torna-se 0. Isso é para resolver o problema descrito aqui - forum. arduino. cc/index. phptopic50473.msg1790086msg1790086 - Teste extensivamente. Classe de modelo RunningAverage. h RunningAverage. cppI estou tentando calcular a média móvel em uma grande matriz numpy que contém NaNs. Atualmente estou usando: Ao calcular com uma matriz mascarada: O resultado que eu estou procurando (abaixo) deve ter NaNs apenas no lugar onde a matriz original, x, tinha NaNs ea média deve ser feito sobre o número de não - NaN elementos no agrupamento (eu preciso de alguma maneira para alterar o tamanho de n na função.) Eu poderia loop em toda a matriz e verificar o índice por índice, mas a matriz que estou usando é muito grande e que levaria muito tempo. Existe uma maneira numpythonic de fazer isto perguntou Oct 7 em 13: 56Para conseguir um desempenho assintótico de O (n) (como a solução codificada manualmente faz), você poderia usar a função Aggregate como em O valor acumulado (implementado como Tipo anônimo) contém dois campos: O resultado contém a compilação de lista de resultados até agora. O trabalho contém os últimos elementos do período-1. A função agregada adiciona o valor atual à Lista de trabalho, cria a média atual e adiciona-a ao resultado e, em seguida, remove o primeiro valor (ou seja, o mais antigo) da lista de trabalho. A semente (isto é, o valor de partida para a acumulação) é construída colocando os primeiros elementos de período-1 em Trabalhar e inicializando Resultado numa lista vazia. Conseqüentemente a agregação começa com o período do elemento (saltando (período-1) elementos no começo) Na programação funcional isto é um padrão de uso típico para a função do aggretate (ou da dobra), btw. A solução não é funcionalmente limpa em que os mesmos objetos de lista (Trabalho e Resultado) são reutilizados em cada etapa. Eu não tenho certeza se isso pode causar problemas se alguns compiladores futuro tentar paralelizar a função de agregação automaticamente (por outro lado Im também não tenho certeza, se isso é possível depois de tudo.). Uma solução puramente funcional deve criar novas listas a cada passo. Observe também que C não possui expressões de lista poderosa. Em algum hipotético pseudocódigo Python-C-misturado poderia escrever a função de agregação como que seria um pouco mais elegante na minha humilde opinião :) Note o tempo de execução de O (n2). Já que você precisa ignorar mais e mais elementos em cada etapa (e afaik Skip (i) tem que chamar IEnumerator. MoveNext i vezes). Veja minha resposta para uma solução em O (n) tempo. (Eu só notei o comentário OPs abaixo que ele / ela irá possivelmente obter os valores de um banco de dados SQL no futuro. Em este caso, eu iria cada desencorajar fortemente desta solução) ndash MartinStettner Mar 3 11 at 0:53 Para o mais eficiente Maneira possível para 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 um buffer circular e causal média móvel filtro), então um método de extensão para fazer Acessível ao LINQ. Primeiro, 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 uma adição, uma subtração e uma multiplicação por ponto de dados anexado, em oposição à N multiplicação de adições 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 de uma 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 você tivesse um método de varredura E aqui está o método de varredura, tomado e ajustado a partir daqui: Isso deve ter um desempenho melhor 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 subseqüente que nós calculamos a partir do valor de sementes acumuladas. Para fazer isso precisamos do valor antigo (que é t-delta) eo valor mais recente para o qual nós zip juntos a série, uma vez desde o início e uma vez deslocado pelo delta. No final, fazemos alguma limpeza adicionando zeros para o comprimento do primeiro período e adicionando o valor de semente inicial. Respondeu Jun 19 13 em 22:58

Comments