Saturday 16 December 2017

Moving average without array


Seu interior está iterando toda a matriz assim thats porque você sempre tem a mesma média (a única para toda a matriz), você deve iterar de 0 para o número atual do exterior para em vez disso. Sua média móvel está sendo atualizada com base em j de seu interior para isso significa que ele irá substituir os valores anteriores de cada novo loop, isso deve estar dentro do exterior para em vez do interior usando i como índice. Você está dividindo sum / j para calcular médias, cada novo loop interno j você vai dividir por 0 a primeira soma. Eu acredito que você pretende usar j1 em vez disso, o índice não é o mesmo que o comprimento atual Dicas para solucionar problemas: Evite usar variáveis ​​para arrays de loop, você deve usar array. length em vez disso. Para uma questão de reproduzir seu problema, você poderia nos dar o problema isolado em vez de seu código atual. Ou seja: Imagine se o erro está em suas entradas, como poderíamos acreditar que você realmente as usou respondidas Você está looping sobre todos os dados de cada vez. Você deve ter (j) (ou algo similar) para sua média mais interna. Além disso, movingAverageisum / j deve ser modificado para lidar com o caso quando j é 0. Em particular, provavelmente deve ser movingAverageisum / averageLength e deve ser aplicado ao slot movingAveragei fora do loop de média. A próxima vez, tome os comentários sobre a atribuição fora da questão antes de publicá-la. Mas desde que você parece muito novo nisso, pense sobre como você iria passar os dados, e fazê-lo fazer isso. Você deve tentar se certificar de que cada loop está parando no ponto correto, e lembre-se que se você parar quando não há mais números, (como quando você está fazendo o loop interno e você só pode obter mais 3 números em vez de 4) O programa precisa parar também. Certifique-se de que seu código está verificando isso. Resposta Sem quaisquer detalhes adicionais, você provavelmente precisará de uma média móvel não ponderada. Em qualquer ponto Ai na matriz de entrada A de comprimento N (com 0ltiltN), isso é simplesmente a média das entradas K anteriores da matriz, até e incluindo Ai. Se não houver K tais valores, então a média dos valores (i1) de A0 a Ai. Inclusive. Um pouco de pensamento irá mostrar-lhe que você não precisa adicionar todos os valores de K cada vez. Basta manter a soma e, ao passar para o próximo ponto (esta é uma média móvel), subtraia o valor que está sendo substituído e adicione o novo valor que irá substituí-lo. (Durante os primeiros pontos K-1, basta adicionar o novo valor à soma e aumentar o contador por 1.) Em qualquer ponto desse processo, a média móvel é a soma corrente dividida pelo valor da contagem atual. Resposta Em uma média móvel, você precisa ter algum tipo de tamanho de janela. Seu tamanho de janela é averageLength, então ele será algo parecido com isto: O loop for começa nos dados atuais e retorna pontos de dados averageLength e os adiciona. Você só terá uma média móvel quando tiver você tem quando você tem pontos de dados suficientes ea média será a soma dividida pelo comprimento médio. Nota: Não testado apenas sudo código, mas esta é a idéia. É possível implementar uma média móvel em C sem a necessidade de uma janela de amostras Ive descobri que eu posso otimizar um pouco, escolhendo um tamanho de janela thats um poder de Dois para permitir bit-deslocamento em vez de dividir, mas não precisando de um buffer seria bom. Existe uma maneira de expressar um novo resultado da média móvel apenas como uma função do antigo resultado e da nova amostra Definir um exemplo de média móvel, através de uma janela de 4 amostras para ser: Adicionar nova amostra e: Uma média móvel pode ser implementada recursivamente , Mas para um cálculo exato da média móvel você deve se lembrar da amostra de entrada mais antiga na soma (ou seja, o 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 recursivamente como Então você sempre precisa lembrar a amostra xn-N para calcular (2). Como indicado por Conrad Turner, você pode usar uma janela exponencial (infinitamente longa), que permite calcular a saída somente da saída anterior e da entrada atual: mas esta não é uma média móvel padrão (não ponderada), mas uma média exponencial Ponderada média móvel, onde as amostras mais no passado obter um peso menor, mas (pelo menos em teoria) você nunca esquecer nada (os pesos apenas ficar menor e menor para amostras no passado). Eu implementei uma média móvel sem memória de item individual para um programa de rastreamento GPS que eu escrevi. Eu começo com 1 amostra e dividir por 1 para obter o avg atual. Eu adiciono então uma outra amostra e divido por 2 à corrente avg. Isso continua até que eu chegar ao comprimento da média. Cada vez depois, eu adiciono na nova amostra, obter a média e remover essa média do total. Eu não sou um matemático, mas isso parecia ser uma boa maneira de fazê-lo. Eu imaginei que iria transformar o estômago de um verdadeiro cara de matemática, mas, acontece que é uma das formas aceitas de fazê-lo. E funciona bem. Basta lembrar que quanto maior o seu comprimento mais lento é seguir o que você deseja seguir. Isso pode não importar a maior parte do tempo, mas quando os satélites seguintes, se você é lento, a trilha poderia estar longe da posição real e vai ficar mal. Você poderia ter uma lacuna entre o sat e os pontos de arrasto. Eu escolhi um comprimento de 15 atualizado 6 vezes por minuto para obter suavização adequada e não ficar muito longe da posição real sentado com os pontos de trilha suavizada. Respondida Nov 16 at 23:03 initialize total 0, count0 (cada vez vendo um novo valor Então uma entrada (scanf), um add totalnewValue, um incremento (count), uma divide average (total / count) Esta seria uma média móvel Sobre todas as entradas Para calcular a média apenas sobre as últimas 4 entradas, exigiria 4 variáveis ​​de entrada, talvez copiando cada entrada para uma variável de entrada mais antiga, calculando a nova média móvel como a soma das 4 variáveis ​​de entrada, dividida por 4 Ser bom se todos os insumos foram positivos para fazer o cálculo médio respondido Feb 3 15 at 4:06 Isso vai realmente calcular a média total e não a média móvel. Como a contagem fica maior o impacto de qualquer nova amostra de entrada se torna nitidamente pequena ndash Hilmar Feb 3 15 at 13:53 Sua resposta 2017 Stack Exchange, IncI sei que isso é possível com o impulso como por: Mas eu realmente gostaria de evitar o uso de impulso. Eu tenho googled e não encontrei qualquer exemplos adequados 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 de 1000 mais recentes como uma amostra de dados. Qual é a maneira mais fácil de conseguir isso que eu experimentei com o uso de uma matriz circular, média móvel exponencial e uma média móvel mais simples e descobriu que os resultados da matriz circular adequado às minhas necessidades. Se suas necessidades são simples, você pode apenas tentar usar uma média móvel exponencial. Simplificando, você faz uma variável de acumulador, e como seu código olha para 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 só dura cerca de 1000 amostras. Hmm, Im realmente não tenho certeza que isso é adequado para você, agora que Ive colocá-lo aqui. O problema é que 1000 é uma janela muito longa para uma média móvel exponencial Não tenho certeza se há um alfa que iria espalhar a média nos últimos 1000 números, sem subfluxo no cálculo do ponto flutuante. Mas se você quisesse uma média menor, como 30 números ou assim, esta é uma maneira muito fácil e rápida de fazê-lo. Respondeu 12 de junho 12 em 4:44 1 em seu borne. A média móvel exponencial pode permitir que o alfa seja variável. Portanto, isso permite que ele seja usado para calcular médias de base de tempo (por exemplo, bytes por segundo). Se o tempo desde a última actualização do acumulador for superior a 1 segundo, deixe alfa ser 1.0. Caso contrário, você pode deixar alfa ser (usecs desde a última atualização / 1000000). Ndash jxh Jun 12 12 at 6:21 Basicamente, eu quero acompanhar a média móvel de um fluxo em curso de um fluxo de números de ponto flutuante usando os mais recentes números de 1000 como uma amostra de dados. Observe que o abaixo atualiza o total como elementos como adicionado / substituído, evitando costal O (N) traversal para calcular a soma - necessária para a média - on demand. Total é feito um parâmetro diferente de T para suporte, e. Usando um longo longo quando totalizando 1000 s longos, um int para char s, ou um dobro ao total float s. Este é um pouco falho em que numsamples poderia ir passado INTMAX - se você se importa que você poderia usar um unsigned longo longo. Ou usar um membro de dados bool extra para gravar quando o recipiente é preenchido pela primeira vez enquanto ciclismo numsamples em torno da matriz (melhor então renomeado algo inócuo como pos). Respondida em 12 de junho de 12 às 5:19, assume-se que o operador quotvoid (amostra T) é, na verdade, operador quotvoid (T amostra) quot. Ndash oPless Jun 8 14 at 11:52 oPless ahhh. Bem manchado. Na verdade, eu quis dizer para ser void operador () (T amostra), mas é claro que você poderia usar qualquer nota que você gostava. Vai corrigir, obrigado. Ndash Tony D 8 Jun 14 às 14:27

No comments:

Post a Comment