Sunday 17 December 2017

Mover média sem buffer


É possível implementar uma média móvel em C sem a necessidade de uma janela de amostras. Achei que posso otimizar um pouco, escolhendo um tamanho de janela que seja um poder de dois para permitir a mudança de bits em vez de dividir, mas não precisar Um buffer seria bom. Existe uma maneira de expressar um novo resultado de média móvel apenas como função do resultado antigo e da nova amostra. Definir um exemplo de média móvel, em uma janela de 4 amostras para ser: Adicionar nova amostra e: Uma média móvel pode ser implementada de forma recursiva , Mas para uma computação exata da média móvel você deve lembrar a amostra de entrada mais antiga na soma (ou seja, a no seu exemplo). Para um comprimento N média móvel você calcula: onde yn é o sinal de saída e xn é o sinal de entrada. Eq. (1) pode ser escrito de forma recursiva, então você sempre precisa se lembrar da amostra xn-N para calcular (2). Conforme indicado por Conrad Turner, você pode usar uma janela exponencial (infinitamente longa) em vez disso, o que permite calcular a saída apenas da saída passada e da entrada atual: mas esta não é uma média móvel padrão (não ponderada), mas exponencialmente Média móvel ponderada, onde as amostras no passado obtêm um peso menor, mas (pelo menos em teoria) você nunca esquece nada (os pesos ficam menores e menores para amostras no passado). Eu implementei uma média móvel sem memória de item individual para um programa de rastreamento de GPS que escrevi. Comece com 1 amostra e divida em 1 para obter o valor médio atual. Em seguida, adicione uma amostra e divida em 2 para a média atual. Isso continua até chegar ao comprimento da média. Cada vez, adiciono na nova amostra, obtenho a média e retire essa média do total. Eu não sou um matemático, mas isso pareceu uma boa maneira de fazê-lo. Achei que isso tornaria o estômago de um verdadeiro matemático, mas, parece ser uma das formas aceitas de fazê-lo. E funciona bem. Basta lembrar que, quanto mais alto for seu comprimento, mais lento seguirá o que deseja seguir. Isso pode não ser importante na maioria das vezes, mas ao seguir os satélites, se você estiver lento, a trilha pode estar longe da posição atual e parecerá ruim. Você poderia ter um espaço entre o Sáb e os pontos de fuga. Eu escolhi um comprimento de 15 atualizado 6 vezes por minuto para obter um alisamento adequado e não chegar muito longe da posição real de SAT com os pontos de trilhos alisados. Respondeu 16 de novembro 16 às 23:03 inicialize o total 0, count0 (cada vez que vê um novo valor) Então uma entrada (scanf), um add totalnewValue, um incremento (contagem), uma média de divisão (quantidade total) Esta seria uma média móvel em relação a Todas as entradas Para calcular a média apenas nas últimas 4 entradas, seria necessário 4 variáveis ​​de entrada, talvez copiando cada entrada para uma variável de entrada mais antiga e, em seguida, calculando a nova média móvel. Como soma das 4 variáveis ​​de entrada, divididas por 4 (o turno direito 2 seria Bom, se todas as entradas fossem positivas para que o cálculo médio fosse respondido em 3 de fevereiro de 15 às 4:06 Isso realmente calculará a média total e NÃO a média móvel. À medida que a contagem aumenta, o impacto de qualquer nova amostra de entrada se torna ndash extremamente lento Hilmar Feb 3 15 às 13:53 Sua resposta 2017 Stack Exchange, IncMetaTrader 5 - Indicadores A classe para desenho Média em movimento usando o buffer de anel - indicador para MetaTrader 5 A classe CMAOnRingBuffer foi projetada para o cálculo de médias móveis (Mov Ing Average) usando o algoritmo do buffer de anel. O arquivo da classe CMAOnRingBuffer. mqh deve ser colocado na pasta IncOnRingBuffer que precisa ser estabelecida no MQL5Include. Dois arquivos com os exemplos usados ​​pela classe dessa pasta são anexados à descrição. O arquivo com a classe do buffer do anel também deve estar nesta pasta. Para obter os dados calculados do indicador do buffer do anel é possível a partir da matriz usual. Por exemplo: Observe que a indexação no buffer do anel é a mesma que em uma série temporal. O indicador calcula o arquivo TestMAOnArrayRB. mq5 com base na série de tempo de preço. O aplicativo do método MainOnArray () é demonstrado O arquivo TestMAOnValueRB. mq5 demonstra o uso do método MainOnValue (). Inicialmente, o indicador MA é calculado e desenha. Então, com base no buffer do anel deste indicador, um outro indicador é calculado. O resultado do trabalho do TestMAOnArrayRB. mq5 com o tamanho do buffer do anel de 256 elementos O resultado do trabalho do TestMAOnValueRB. mq5 com o tamanho do buffer do anel de 256 elementos Estou tentando completar um projeto de atribuição matlab com o Seguinte pergunta: Escreva uma função chamada motionaverage que leva um escalar chamado x como um argumento de entrada e retorna um escalar. A função usa um buffer para manter as entradas anteriores e o buffer pode conter no máximo 25 entradas. Especificamente, a função deve salvar as 25 entradas mais recentes em um vetor (o buffer). Cada vez que a função é chamada, ele copia o argumento de entrada em um elemento do buffer. Se já houver 25 entradas armazenadas no buffer, ele descarta o elemento mais antigo e salva o atual no buffer. Depois de armazenar a entrada no buffer, ele retorna a média de todos os elementos no buffer. A solução que eu forneço é a seguinte: de acordo com a graduação automática, minha função funciona corretamente quando os valores 1-50 estão passando consecutivamente, mas falham quando os valores de uma onda sinusoidal barulhenta estão passando consecutivamente (o que fui informado que pode ser devido a alguns Tipo de erro de redondeamento). Agradeceria se algum de vocês pudesse fornecer algumas dicas sobre as possíveis etapas de erro no meu código (anexado acima). Agradeço antecipadamente

No comments:

Post a Comment