Wednesday 18 October 2017

Média Móvel Qt


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, 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 isDetached feita em cada chamada ao operador. No QVector :: append. Não é apenas chamada isDetached. Mas também verifica e modifica o comprimento também. Observe 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 intrinssil SIMD. Sei que isso é viá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 números 1000 mais recentes como uma amostra de dados. Qual é a maneira mais fácil de conseguir 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 correspondiam melhor às 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, conforme 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ê só precisa encontrar um valor de alfa onde o efeito de uma determinada amostra dura apenas cerca de 1000 amostras. Hmmm, na verdade, não tenho certeza de que isso é adequado para você, agora que eu 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. Então isso permite que ele seja usado para calcular médias base de tempo (por exemplo, bytes por segundo). Se o tempo decorrido desde a última atualização do acumulador for superior a 1 segundo, você deixa alfa ser 1.0. Caso contrário, você pode deixar o alfa ser (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 amostra de dados. Observe que as atualizações abaixo atualizam o total como elementos como adicionados substituídos, evitando a passagem O (N) dispendiosa para calcular a soma - necessária para a demanda média. 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 adicional de dados do bool para gravar quando o recipiente é preenchido pela primeira vez ao andar de bicicleta numsamples em torno da matriz (o melhor que renomeou 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 visto. 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: 27 Calcula médias ponderadas no Excel com SUMPRODUCT Ted French tem mais de quinze anos de experiência em ensinar e escrever sobre programas de planilhas, como Excel, Google Spreadsheets e Lotus 1-2-3. Leia mais Atualizado em 07 de fevereiro de 2016. Visão geral média ponderada versus não ponderada Normalmente, ao calcular a média ou a média aritmética, cada número tem igual valor ou peso. A média é calculada adicionando um intervalo de números juntos e dividindo esse total pelo número de valores no intervalo. Um exemplo seria (2433434435436) 5, o que dá uma média não ponderada de 4. No Excel, tais cálculos são facilmente realizados usando a função MÉDIA. Uma média ponderada, por outro lado, considera que um ou mais números no intervalo valem mais ou têm um peso maior do que os outros números. Por exemplo, certas marcas na escola, como exames intermediários e finais, geralmente valem mais do que testes ou tarefas normais. Se a média for usada para calcular a nota final de um estudante, os exames de meio termo e final receberiam um peso maior. No Excel, as médias ponderadas podem ser calculadas usando a função SUMPRODUCT. Como a função SUMPRODUCT funciona O que SUMPRODUCT faz é multiplicar os elementos de duas ou mais matrizes e, em seguida, adicionar ou somar os produtos. Por exemplo, numa situação em que duas matrizes com quatro elementos cada são inseridas como argumentos para a função SUMPRODUCT: o primeiro elemento da matriz1 é multiplicado pelo primeiro elemento na matriz2 o segundo elemento da matriz1 é multiplicado pelo segundo elemento da matriz2 o terceiro O elemento da matriz1 é multiplicado pelo terceiro elemento da matriz2, o quarto elemento da matriz1 é multiplicado pelo quarto elemento da matriz2. Em seguida, os produtos das quatro operações de multiplicação são somados e retornados pela função como resultado. Excel SUMPRODUCT Função Sintaxe e Argumentos A sintaxe de uma função refere-se ao layout da função e inclui o nome, parênteses e argumentos da função39. A sintaxe da função SUMPRODUCT é: 61 SUMPRODUCT (array1, array2, array3. Array255) Os argumentos para a função SUMPRODUCT são: array1: (requerido) o primeiro argumento da matriz. Array2, array3. Array255: (opcional) arrays adicionais, até 255. Com duas ou mais matrizes, a função multiplica os elementos de cada matriz e depois adiciona os resultados. - os elementos de matriz podem ser referências de células à localização dos dados na planilha ou números separados por operadores aritméticos - como sinais positivos (43) ou menos (-). Se os números forem inseridos sem serem separados por operadores, o Excel os trata como dados de texto. Esta situação é abordada no exemplo abaixo. Todos os argumentos da matriz devem ter o mesmo tamanho. Ou, em outras palavras, deve haver o mesmo número de elementos em cada matriz. Caso contrário, SUMPRODUCT retorna o valor de erro VALUE. Se qualquer elemento de matriz não são números - como dados de texto - SUMPRODUCT trata-os como zeros. Exemplo: Calcule a média ponderada no Excel O exemplo mostrado na imagem acima calcula a média ponderada para a nota final de um aluno usando a função SUMPRODUCT. A função cumpre isso: multiplicando as várias marcas pelo seu fator de peso individual, adicionando os produtos dessas operações de multiplicação juntos, dividiu a soma acima pelo total do fator de ponderação 7 (1431432433) para as quatro avaliações. Inserindo a Fórmula de Ponderação Como a maioria das outras funções no Excel, SUMPRODUCT normalmente é inserido em uma planilha usando a caixa de diálogo da função. No entanto, uma vez que a fórmula de ponderação usa SUMPRODUCT de maneira não padrão - o resultado da função é dividido pelo fator de peso - a fórmula de ponderação deve ser digitada em uma célula da planilha. As seguintes etapas foram usadas para inserir a fórmula de ponderação na célula C7: clique na célula C7 para torná-la a célula ativa - o local onde a marca final do aluno será exibida Digite a seguinte fórmula na célula: Pressione a tecla Enter no teclado A resposta 78.6 deve aparecer na célula C7 - sua resposta pode ter mais casas decimais A média não ponderada para as mesmas quatro marcas seria 76.5 Uma vez que o aluno teve melhores resultados para os exames intermediários e finais, a ponderação da média ajudou a melhorar sua marca geral. Variações de Fórmula Para enfatizar que os resultados da função SUMPRODUCT são divididos pela soma dos pesos para cada grupo de avaliação, o divisor - a parte que faz a divisão - foi inserido como (1431432433). A fórmula de ponderação global poderia ser simplificada ao inserir o número 7 (a soma dos pesos) como o divisor. A fórmula seria então: esta escolha está bem se o número de elementos na matriz de ponderação for pequeno e eles possam ser facilmente agregados, mas torna-se menos efetivo à medida que o número de elementos na matriz de ponderação aumenta, tornando sua adição mais difícil. Outra opção e, provavelmente, a melhor escolha - uma vez que usa referências de células em vez de números no total do divisor - seria usar a função SUM para que o divisor com o total da fórmula: geralmente é melhor inserir referências de células em vez de números reais Em fórmulas, pois simplifica a sua atualização se os dados da fórmula39 forem alterados. Por exemplo, se os fatores de ponderação para Atribuições foram alterados para 0,5 no exemplo e para Testes para 1,5, as duas primeiras formas da fórmula teriam que ser editadas manualmente para corrigir o divisor. Na terceira variação, apenas os dados nas células B3 e B4 precisam ser atualizados e a fórmula irá recalcular o resultado.

No comments:

Post a Comment