Estoy tratando de completar un proyecto de asignación Matlab con la siguiente pregunta: Escribir una función llamada movingaverage que toma un escalar llamado x como un argumento de entrada y devuelve un escalar. La función utiliza un búfer para contener entradas previas, y el búfer puede contener un máximo de 25 entradas. Específicamente, la función debe guardar las más recientes 25 entradas en un vector (el búfer). Cada vez que se llama a la función, copia el argumento de entrada en un elemento del búfer. Si ya hay 25 entradas almacenadas en el búfer, descarta el elemento más antiguo y guarda el actual en el búfer. Después de haber almacenado la entrada en el búfer, devuelve la media de todos los elementos del búfer. La solución que ofrezco es la siguiente: Según el nivelador automático mi función funciona correctamente cuando los valores 1-50 pasan consecutivamente, pero falla cuando los valores de una onda senoidal ruidosa pasan consecutivamente (lo que me ha sido informado que podría ser debido a algunos Tipo de un error de redondeo). Estaría agradecido si alguno de ustedes pudiera proporcionarme algunos consejos sobre los posibles pasos de error en mi código (adjunto anteriormente). Gracias de antemanoCreated en Miércoles 08 de Octubre de 2008 20:04 Actualizado el Jueves, 14 de Marzo de 2013 01:29 Escrito por Batuhan Osmanoglu Hits: 40482 Promedio móvil En Matlab A menudo me veo en necesidad de promediar los datos que tengo para reducir el Ruido un poco. Escribí funciones de pareja para hacer exactamente lo que quiero, pero matlabs construido en función de filtro funciona bastante bien también. Aquí Ill escribir sobre 1D y 2D promedio de los datos. El filtro 1D se puede realizar usando la función de filtro. La función de filtro requiere al menos tres parámetros de entrada: el coeficiente de numerador para el filtro (b), el coeficiente de denominador para el filtro (a) y los datos (X), por supuesto. Un filtro de promedio en funcionamiento puede definirse simplemente por: Para datos 2D podemos utilizar la función Matlabs filter2. Para obtener más información sobre cómo funciona el filtro, puede escribir: Aquí hay una implementación rápida y sucia de un filtro de 16 por 16 de promedio móvil. Primero tenemos que definir el filtro. Puesto que todo lo que queremos es la contribución igual de todos los vecinos, podemos usar la función unos. Dividimos todo con 256 (1616) ya que no queremos cambiar el nivel general (amplitud) de la señal. Para aplicar el filtro simplemente podemos decir lo siguiente A continuación se presentan los resultados de la fase de un interferograma SAR. En este caso, Range está en el eje Y y Azimuth está asignado en el eje X. El filtro tenía 4 píxeles de ancho en Rango y 16 píxeles de ancho en Azimut. Tengo una matriz de datos de series temporales para 8 variables con aproximadamente 2500 puntos (10 años de lunes a viernes) y quisiera calcular la media, la varianza, la asimetría y la curtosis sobre una base de media móvil. Digamos cuadros 100 252 504 756 - Quisiera calcular las cuatro funciones arriba sobre sobre cada uno de los (tiempo-) cuadros, sobre una base diaria - así que la vuelta para el día 300 en el caso con el 100 marco del día, sería media Kurtosis de desviación de desviación del período day201-day300 (100 días en total). y así. Sé que esto significa que obtendría una salida de matriz, y el número de la primera trama de días sería NaNs, pero no puedo encontrar la indexación necesaria para hacer esto. Esta es una pregunta interesante porque creo que la solución óptima es diferente para la media que para las otras estadísticas de la muestra. He proporcionado un ejemplo de simulación a continuación que puede trabajar a través de. Primero, elija algunos parámetros arbitrarios y simule algunos datos: Para la media, use el filtro para obtener un promedio móvil: Originalmente pensé resolver este problema usando conv como sigue: Pero como PhilGoddard señaló en los comentarios, el enfoque de filtro evita la Necesidad del bucle. También tenga en cuenta que Ive elegido para hacer las fechas en la matriz de salida corresponden a las fechas en X para que en el trabajo posterior se puede utilizar los mismos subíndices para ambos. Así, las primeras observaciones de WindowLength-1 en MeanMA serán nan. Para la varianza, no puedo ver cómo utilizar filtro o conv o incluso una suma de ejecución para hacer las cosas más eficientes, por lo que en su lugar realizar el cálculo manualmente en cada iteración: Podemos acelerar ligeramente las cosas mediante la explotación del hecho de que ya hemos Calculó la media móvil media. Simplemente reemplace la línea de bucle dentro de lo anterior con: Sin embargo, dudo que esto haga mucha diferencia. Si alguien más puede ver una manera inteligente de usar filtro o conv para obtener la variación de la ventana móvil Id estar muy interesado en verlo. Dejo el caso de skewness y kurtosis al OP, ya que son esencialmente igual que el ejemplo de la varianza, pero con la función apropiada. Un último punto: si estuviera convirtiendo lo anterior en una función general, podría pasar una función anónima como uno de los argumentos, entonces tendría una rutina de promedio móvil que funciona para la elección arbitraria de las transformaciones. Final, punto final: Para una secuencia de longitudes de ventana, simplemente haga un bucle sobre el bloque de código completo para cada longitud de ventana. Sí, la función de filtro es realmente mejor para la media - pero yo quería hacer esto para varias funciones diferentes, no sólo la media. Acabo de publicar mi respuesta porque funcionó para mí y pensé que podría ayudar a alguien más. Ndash Dexter Morgan Apr 15 14 at 12:40
Comments
Post a Comment