Saturday, 21 October 2017

Media Móvil En Lenguaje C


Sé que esto es alcanzable con el alza como por: Pero yo realmente quisiera evitar el uso del alza. He googled y no he encontrado ningún ejemplo adecuado o legible. Básicamente, quiero seguir el promedio móvil de una corriente en curso de una corriente de números de punto flotante utilizando los números 1000 más recientes como una muestra de datos. ¿Cuál es la manera más fácil de lograr esto experimenté con el uso de una matriz circular, media móvil exponencial y una media móvil más simple y encontró que los resultados de la matriz circular se adapta a mis necesidades mejor. Si sus necesidades son simples, puede intentar usar una media móvil exponencial. Puesto simplemente, usted hace una variable del acumulador, y como su código mira cada muestra, el código actualiza el acumulador con el nuevo valor. Usted escoge un alfa constante que está entre 0 y 1, y calcule esto: Usted apenas necesita encontrar un valor del alfa donde el efecto de una muestra dada dura solamente cerca de 1000 muestras. Hmm, no estoy realmente seguro de que esto es adecuado para usted, ahora que he puesto aquí. El problema es que 1000 es una ventana bastante larga para un promedio móvil exponencial No estoy seguro de que haya un alpha que se extendería el promedio en los últimos 1000 números, sin subflujo en el cálculo de punto flotante. Pero si usted quisiera un promedio más pequeño, como 30 números o tan, esto es una manera muy fácil y rápida de hacerla. Respondió 12 de junio 12 en 4:44 1 en su puesto. El promedio móvil exponencial puede permitir que el alfa sea variable. Así, esto permite que se utilice para calcular promedios de base de tiempo (por ejemplo, bytes por segundo). Si el tiempo transcurrido desde la última actualización del acumulador es de más de 1 segundo, deje que alfa sea 1.0. De lo contrario, puede permitir que alpha be (usecs desde la última actualización / 1000000). Ndash jxh 12 de junio a las 6:21 Básicamente, quiero seguir el promedio móvil de una corriente en curso de una corriente de números de punto flotante usando los números 1000 más recientes como una muestra de datos. Tenga en cuenta que el siguiente actualiza el total como elementos añadidos / reemplazados, evitando costosos recorridos O (N) para calcular la suma - necesaria para el promedio - a la demanda. Total se hace un parámetro diferente de T a soporte, p. Usando un largo largo cuando totalizan 1000 long s, un int para char s, o un doble a total float s. Esto es un poco defectuoso en que numsamples podría ir más allá de INTMAX - si te importa que podría utilizar un unsigned mucho tiempo. O utilice un miembro de datos de bool extra para grabar cuando el contenedor se rellena primero mientras cicla numsamples alrededor de la matriz (mejor entonces cambia el nombre de algo inocuo como pos). Respondió el 12 de Junio ​​12 a las 5:19 se supone que el operador quotvoid (T sample) quot es realmente operador quotvoid (T sample) quot. Ndash oPless Jun 8 14 at 11:52 oPless ahhh. bien descrito. En realidad quería que fuera para ser operador vacío () (T muestra), pero por supuesto, usted podría utilizar cualquier notación que te gustaba. Se arreglará, gracias. Ndash Tony D Jun 8 14 a las 14: 27Se puede implementar una media móvil en C sin la necesidad de una ventana de muestras Ive encontró que puedo optimizar un poco, al elegir un tamaño de ventana thats un poder de dos para permitir bit - cambiar en vez de dividir, pero no necesitar un amortiguador sería agradable. ¿Existe una manera de expresar un nuevo promedio móvil sólo como una función del resultado anterior y la nueva muestra Definir un ejemplo de media móvil, a través de una ventana de 4 muestras para ser: Agregar nueva muestra e: Un promedio móvil se puede implementar recursivamente , Pero para un cálculo exacto de la media móvil tiene que recordar la más antigua muestra de entrada en la suma (es decir, el a en su ejemplo). Para una longitud N de media móvil se calcula: donde yn es la señal de salida y xn es la señal de entrada. Eq. (1) se puede escribir recursivamente como Así que siempre necesita recordar la muestra xn-N para calcular (2). Como señaló Conrad Turner, puede usar una ventana exponencial (infinitamente larga), que le permite calcular la salida sólo de la salida pasada y la entrada actual: pero esto no es una media móvil estándar (no ponderada) sino exponencial (Por lo menos en teoría) nunca se olvida nada (los pesos sólo se hacen más pequeños y más pequeños para las muestras en el pasado). Inicializar total 0, count0 (cada vez que se ve un nuevo valor Entonces una entrada (scanf), una suma totalnewValue, un incremento (count), un promedio de división (total / count) Esta sería una media móvil sobre todas las entradas Para calcular el promedio Sobre sólo las 4 últimas entradas, requeriría 4 variables de entrada, tal vez copiando cada entrada a una variable de entrada más antigua, luego calculando la nueva media móvil como suma de las 4 variables de entrada, dividida por 4 (el desplazamiento a la derecha 2 sería bueno si todas las entradas fueran Positivo para hacer el cálculo promedio Tengo una cantidad de 4000 datos de stock, y tring para calcular el promedio móvil para todos los valores de datos, pero ya que el promedio móvil se basa en datos anteriores y no puedo calcular la SMA de 15 días para los primeros 14 días , Omitir los primeros 14 días y calcular el SMA en el resto de los datos. Y tiene que estar utilizando LINQ para lograr.¿Alguien puede dar una muestra o sugerencia de cómo utilizar LINQ para calcular el promedio móvil La salida de los valores medios son Alrededor de 500s realmente no entiendo cómo es que es posible obtener ese alto valor. Promedio móvil con la matriz de sumas: 06/07/2012 562,49 571,72 06/08/2012 565,84 580,32 06/11/2012 568,56 571,17 06/12/2012 569,55 576,16 13/06/2012 570,56 572,16 14/06/2012 570,63 571,53 06 / 15/2012 571,21 574,13 18/06/2012 572,78 585,78 19/06/2012 573,79 587,41 20/06/2012 574,23 585,74 21/06/2012 574,22 577,67 22/06/2012 575,63 582,10 25/06/2012 576,06 570,77 06/26 / 2012 576,68 572,03 27/06/2012 576,88 574,50 28/06/2012 576,7 569,05 29/06/2012 576,95 584,00 07/02/2012 578,37 592,52 07/03/2012 579,92 599,41 07/03/2012 581,74 599,41 Editado por Leemx Friday , 16 de noviembre de 2012 2:59 AM Movido por Lisa Zhu Lunes 19 de noviembre de 2012 7:38 AM linq related (De: Visual C General) viernes, 16 de noviembre de 2012 2:42 Para crear una media móvil , Empezaría por crear un rango de 0 a (longitud de la lista de datos - duración del período de movimiento), luego para cada valor en el rango seleccionar elementos x a x 43 longitud del período en movimiento y calcular el promedio. Todo en una declaración LINQ agradable: Tenga en cuenta que esto no es muy eficiente, ya que básicamente iterar sobre la lista de datos para cada valor en el rango .. Hey, mira Este sistema permite firmas de más de 60 cha Editado por Arno Brouwer Viernes, Noviembre 23, 2012 4:42 PM Marcado como respuesta por Alexander Sun Viernes, 07 de diciembre de 2012 2:44 Viernes, 23 de noviembre de 2012 4:41 PM Todas las respuestas Una muestra de su declaración LINQ ayudaría. Para crear un promedio móvil, comenzaría creando un rango de 0 a (longitud de la lista de datos - longitud del período móvil), luego para cada valor en el rango seleccionar elementos x A x 43 la duración del período en movimiento y calcular el promedio. Todo en una declaración LINQ agradable: Tenga en cuenta que esto no es muy eficiente, ya que básicamente iterar sobre la lista de datos para cada valor en el rango .. Hey, mira Este sistema permite firmas de más de 60 cha Editado por Arno Brouwer Viernes, Noviembre 23, 2012 4:42 PM Marcado como respuesta por Alexander Sun Viernes, 07 de diciembre de 2012 2:44 Viernes, 23 de noviembre de 2012 16:41 Microsoft está llevando a cabo una encuesta en línea para entender su opinión sobre el sitio web Msdn. Si decide participar, se le presentará la encuesta en línea cuando abandone el sitio Web de Msdn. ¿Quieres participar? Ayúdanos a mejorar MSDN. Visite nuestra página UserVoice para enviar y votar ideas Centros de desarrollo Recursos de aprendizaje Programas de apoyo comunitario

No comments:

Post a Comment