Wednesday 15 November 2017

Qt Moving Average


Estou tentando retornar um QVector de uma função que é suposto calcular a média móvel. Minha pergunta é como tornar a função mais eficiente. A matemática está bem, estou mais perguntando se eu faço algo errado ao retornar o QVector. Aqui está o código que eu tenho até agora: eu uso o construtor padrão para manter o QVector de definir um valor padrão. Eu tentei o mesmo com o redimensionamento, que é muito mais lento. Você tem alguma sugestão sobre como isso pode ser otimizado. Uma vez que você afirma que o retorno demora mais, o problema pode não estar na própria função, mas no site onde o valor retornado é usado. Infelizmente, heres onde seu código desperdiça tempo: na alocação do QVector cada vez que a média é invocada. Presumivelmente, é chamado repetidamente, então não há necessidade de atribuir um novo vetor a cada vez. No operador QVector ::. Tem um pouco mais de sobrecarga do que o acesso à rede simples, porque há essa irritante chamada isdetada feita em cada chamada ao operador. No QVector :: append. Não é apenas chamada isDetached. Mas também verifica e modifica o comprimento também. Note-se que não há absolutamente nada de errado com o retorno do seu valor. É uma operação trivial e leva pouco tempo. Você está fazendo isso OK quando se trata de retornar - e retornar apenas. Mas você não nos mostra como você usa o valor retornado, então eu não posso dizer se talvez você esteja fazendo algo errado lá. Para evitar alocações repetidas e sobrecarga do operador, você pode usar uma classe que mantenha um vetor pronto para reutilização e use um ponteiro para vetores-dados em vez de usar o vetor diretamente. Para torná-lo mais rápido, provavelmente exigiria o uso de SIMD intrinsseca. Sei que isso é realizável com o aumento 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 1000 números mais recentes como amostra de dados. Qual é a maneira mais fácil de alcançar 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 adequavam 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, à medida que 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ê precisa apenas encontrar um valor de alfa onde o efeito de uma determinada amostra dura apenas cerca de 1000 amostras. Hmm, na verdade, não tenho certeza de que isso é adequado para você, agora que eu já 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. Assim, isso permite que ele seja usado para calcular médias base de tempo (por exemplo, bytes por segundo). Se o tempo desde a última atualização do acumulador for superior a 1 segundo, você deixa alfa ser 1.0. Caso contrário, você pode deixar alpha be (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 uma amostra de dados. Observe que as atualizações abaixo atualizam o total como elementos como adicionados, evitando a trajetória O (N) cara para calcular a soma - necessária para a média - na demanda. 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 extra de dados do bool para gravar quando o recipiente é preenchido pela primeira vez ao andar de bicicleta numsamples em torno da matriz (melhor então renomeado 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 manchado. 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: 27QT Study Pack 2006 wip (Página 141-142).doc - 1. Moving. 1. Dados periódicos médios móveis, p. Ex. As vendas mensais podem ter flutuações aleatórias todos os meses, apesar de uma tendência geral ser evidente. A média móvel ajuda a suavizar essas mudanças aleatórias. Uma média móvel é a Previsão para um período que leva a média dos períodos anteriores. Exemplo: A tabela abaixo representa as vendas da empresa, calcula 3 e 6 médias móveis mensais, para os dados Vendas de meses janeiro de 1200 mais 12 de março de 1310 abril 1270 maio 1190 junho 1290 julho 1410 agosto 1360 setembro 1430 outubro 1280 novembro 1410 dezembro 1390 Solução. Estes são calculados como Follows Esta pré-visualização tem seções intencionalmente desfocadas. Inscreva-se para ver a versão completa. Previsão de Aprilrsquos Jan Fev 3 de Mar 120012801310 3 previsão de Mayrsquos fev mar 3 de abril 128013101270 3 E, portanto, onhellip De igual forma, para a média móvel mensal 6 Previsão de julho Jan Feb MarAprMay 6 de junho 120012801310127011901290 6 E, portanto, onhellip 3 meses de média móvel média média de 6 meses em abril de 1263 de maio de 1287 de junho 1257 de julho de 1250 1257 de agosto de 1297 1292 de setembro de 1353 1305 de outubro de 1400 1325 de novembro de 1357 1327 de dezembro de 1373 1363 Nota: Ao traçar a média móvel em gráficos, os pontos são plotados como o ponto médio do período da média, por exemplo No nosso exemplo, a previsão Esta prévia tem seções intencionalmente desfocadas. Inscreva-se para ver a versão completa. Este é o fim da pré-visualização. Inscreva-se para acessar o resto do documento.

No comments:

Post a Comment