Friday 15 December 2017

Moving average stack overflow


É 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-shifting em vez de dividir, mas não necessitando 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). Inicialize total 0, count0 (cada vez que vê um novo valor) Então uma entrada (scanf), uma 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 Sobre apenas as 4 últimas 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 (desvio para a direita 2 seria bom se todas as entradas fossem Positivo para fazer o cálculo médioConsider ter um sinal no domínio do tempo, e você deseja suavizar o sinal. Movendo média e Gaussian filtros que são usados. Como você escolher qual é usado para o que Quais são as condições em que Gaussian é melhor e Condições em que a média móvel é melhor O que eu estou tentando fazer com este sinal é, detecção de pico inicialmente, em seguida, aplicar pequenas janelas em cada parte e descobrir as mudanças de freqüência (Doppler turnos) para cada parte para descobrir a direção do movimento de A mudança de freqüência. Eu quero suavizar o sinal no domínio do tempo sem perda de informações no domínio da freqüência. Eu pensei para a parte de descobrir os turnos Doppler, usando STFT seria uma boa idéia. Se referência poderia ser dada a algum papel, que também seria realmente útil. Perguntou Sep 29 às 11: 12 Se o desempenho deste código é crítico, então poderia fazer sentido para evitar alocações heap para Candle s. Acho que a maneira mais razoável de fazer isso seria fazer Candle em uma estrutura. Embora os tipos de valores mutáveis ​​sejam maus. Assim que eu refatoraria também a vela para ser imutável. Isso também significa que a implementação de newestCandle teria que mudar, provavelmente em um par de campos duplos (ou, alternativamente, uma classe mutable e resettable separada). Eu não vejo qualquer outro problema potencial de desempenho em seu código. Mas quando se trata de desempenho, você deve sempre confiar em perfis, não sua intuição (ou alguém elses). Além disso, eu não gosto de alguns nomes de seus métodos. Especificamente: ValueUpdated. Nomes de métodos geralmente devem estar no formulário fazer algo, não aconteceu algo. Então eu acho que um nome melhor seria UpdateValue. Adicionar. Modificar. Estas são as duas operações fundamentais do seu MovingAverage e eu acho que esses nomes não expressam o significado bem. Eu chamaria-lhes algo como MoveAndSetCurrent e SetCurrent. respectivamente. Embora tal nomeação indica que as operações fundamentais devem ser bastante Move e SetCurrent. Im over-visualização algum artigo sobre o uso de média móvel para ajustar um intervalo de sondagem. Neste artigo, eles votam um feed RSS, mas ele pode ser usado para qualquer sistema precisa ser consultado. Os autores sugerem que nos momentos em que você fizer uma votação muito cedo (sem novos artigos), você deve adicionar um item virtual (artigo virtual) e atualizar o intervalo de consulta da seguinte forma: Aqui w é o tamanho da janela, un é o novo intervalo, U é o anterior. Ik é o tempo de publicação do artigo k-ésimo e p é o tempo da última pesquisa que acabamos de fazer. Minha pergunta: os autores afirmam que o item virtual é usado para aumentar o intervalo de sondagem (como não há novos artigos reais), mas considere uma janela de tamanho 5, onde o artigo foi publicado a cada 5 minutos, então nosso u5 é exatamente 5 minutos. Agora, a pesquisa 6-th trouxe novos artigos e foi feito no momento p i u5 assim u6 será de 5 minutos também (de acordo com a fórmula acima). Indutivamente, se nenhum artigo novo for publicado o intervalo permanece em 5 minutos. É o meu raciocínio direito Os autores afirmam que o intervalo de sondagem poderia ser aumentado, mas eu não vejo como. Pediu Oct 4 às 9: 11Eu preciso acompanhar os últimos 7 dias de horas de trabalho em um loop de leitura de arquivo plano. Seu ser usado para medir fatigueability de rosters do trabalho. Agora eu tenho algo que funciona, mas parece bastante detalhado e Im não tenho certeza se theres um padrão thats mais sucinto. Atualmente, eu tenho uma classe Java com uma matriz estática para armazenar os últimos dados x dias, então como eu leio através do arquivo, eu cortar o primeiro elemento e mover os outros 6 (por uma semana rodando total) de volta por um. O processamento dessa matriz estática é feito em seu próprio método ie. Minha pergunta: esta é uma abordagem de design razoável, ou há algo ofuscantemente óbvio e simples para fazer essa tarefa Caras de agradecimento perguntou Aug 30 11 at 14:33 Thanks alot guys: Eu tenho a mensagem: use um objeto de nível mais alto e explorar o Métodos relevantes ou um tampão circular. Grandes respostas, todas elas. Quando você pensa sobre isso, você sempre precisa de acesso a toda a matriz para que você possa se livrar da primeira entrada - que eu wasn39t 100 certeza do meu próprio. I39m aliviado que eu hadn39t perdeu um forro 1 e foi basicamente em uma faixa razoável, se não eficiente e concisa Isso é o que eu amo sobre este site: de alta qualidade, respostas relevantes de pessoas que sabem o seu sht. Ndash Pete855217 Aug 30 11 at 15:05 Por que você inicializar runningTotal para null Qual é o seu tipo Onde é declarado Faria bem se você colocar alguns exemplos de código que se assemelham ao código Java real. Seguindo em frente, minha crítica seria a seguinte: a sua função faz muito. Uma função ou método deve ser coeso. Mais apropriadamente, eles deveriam fazer uma coisa e uma coisa só. Pior ainda, o que acontece em seu loop for quando x 5 Você copiar runningTotal6 em runningTotal5. Mas então você tem duas cópias do mesmo valor na posição 5 e 6. No seu projeto, sua função move / shuffles os itens em sua matriz calcula o total imprime coisas para o erro padrão retorna o total Ele faz muito. Minha primeira sugestão é não mover coisas ao redor da matriz. Em vez disso, implementar um buffer circular e utilizá-lo em vez da matriz. Simplificará seu projeto. Minha segunda sugestão é dividir as coisas em funções que são coesas: ter uma estrutura de dados (um buffer circular) que permite adicionar a ele (e que descarta a entrada mais antiga sempre que atingir sua capacidade.) Ter a estrutura de dados implementar um Interator tem uma função que calcula o total no iterador (você não se importa se você está calculando o total de uma matriz, lista ou bufer circular.) Não chamá-lo total. Chamá-lo de soma, que é o que você está computando. Isso é o que fazer :) That39s grande informação luis, no entanto lembre-se esta função é uma pequena parte da funcionalidade da classe, e seria exagero para adicionar muito código para torná-lo perfeito. Você está tecnicamente correto, e eu entendo que meu código faz muito 39, mas ao mesmo tempo às vezes é melhor errar do lado do código menor, mais claro do que ir para a perfeição. Dado o meu Java habilidades, mesmo fazendo o pseudocode você descreve compilação teria me soprar meu orçamento sobre este (), mas obrigado pela descrição clara. Ndash Pete855217 Aug 31 11 at 2:23 Hmmm, não é sobre a perfeição, mas sobre as práticas industriais estabelecidas que temos conhecimento para as últimas 3 décadas. Código limpo é sempre um que é particionado. Temos décadas de evidências que indicam que este é o caminho a percorrer no caso geral (em termos de custo-eficiência, redução de defeitos, compreensão, etc.). A menos que seja um código descartável para um tipo único de coisa. Nunca é custoso fazer isso quando se inicia qualquer análise de problemas desta maneira. Codificação 101, quebrar o problema eo código segue, nem overkill nem difícil) ndash luis. espinal Aug 31 11 at 15:55 Sua tarefa é muito simples eo aproach que você adotou é certamente bom para o trabalho. No entanto, se você quiser usar um projeto melhor, você deve se livrar de todo esse movimento número você melhor usar uma fila FIFO e fazer bom uso de métodos push e pop dessa forma o código não vai refletir qualquer movimento de dados, apenas as duas ações lógicas De novos dados e remover dados com mais de 7 dias. Respondeu 30 Ago 11 at 14:49

No comments:

Post a Comment