¿Cuanto ruido puede resolver el proceso de correlación?

Comportamiento del proceso de correlación ante un incremento del ruido aplicado a una imagen 
Resumen
Basado en una entrada anterior, me dio mucha curiosidad saber cómo se comportaría el proceso de correlación ante un incremento controlado de ruido en las imágenes. ¿Siempre tendrá un buen rendimiento?

Así que seleccione una imagen – la original para este estudio – y le añadí ruido por medio de un Corel-Photo-Paint, para crear las imágenes “ruido”. Así, cree diez imágenes que presentaban ruido “gaussiano aleatorio“ en un intervalo de 0 a 100%, con incrementos de 10% para cada una.

Después, le hice unas ligeras modificaciones al código original de identificación de imágenes por correlación, de modo que me mostrara la tendencia del comportamiento del promedio-de-los máximos-de-la-correlación de las imágenes en cuestión (deben ver el código para entender este proceso).

El resultado es la imagen que ilustra esta entrada. Cuando la imagen no presenta ruido, el proceso de correlación de la imagen consigo misma es igual a 1 (el valor ideal). En contraste, cuando la el ruido es máximo la correlación es aprox. 0.6. Más aún la tendencia de de este estudio es una línea recta; en otras palabras, el proceso de correlación es lineal en función del ruido añadido. Lo cual es una buena noticia para quienes usamos esta función para diversos estudios comparativos.

Sin embargo, falta hacer este estudio con ruido programado desde Matlab u otro software con mayor control de las variables del ruido añadido. De modo que sea claro cuál es el umbral cuantitativo que muestre cuando este proceso sea inadecuado.

Preguntas para pensar
1) ¿Cómo se comportara este proceso ante ruido armónico?
2) Por si sólo este proceso no identifica el tipo de ruido. ¿Solo sirve para discriminar?, ¿Cómo se puede usar como filtro para mejorar la imagen?

Ejercicios
1) Use Matlab para añadir ruido a la imagen de modo sistemático. Analice los archivos generados. ¿Cómo se comporta el proceso de correlación ante el ruido blanco, el rosa, y otros?

Solución al ejercicio: Identificando huellas digitales simuladas con Matlab (video y script)



Resultado gráfico del análisis de las imágenes. El archivo núm. 14 corresponde al  análisis de la misma imagen. De toda la base datos, el archivo núm. 3 es el que se parece más al archivo núm. 14



Resumen
Hace unos días propuse un ejercicio estilo el programa de televisión CSI. Dibuje unos cuantos garabatos como si fueran huellas digitales; a una de ellos lo llamé "asesino" al resto "sospechoso_num" --a todas las imágenes les añadí un poco de ruido--. Pues bien. revisando la pequeña base de datos uno se puede dar cuenta que el archivo asesino coincide con la imagen del sospechoso número 3. El ejercicio trata de emplear código Matlab para hacer esta identificación.

Pueden existir muchas soluciones, aquí les muestre el uso de la función correlación estadística  (CORR, en Matlab) para hacer esta identificación automática. La correlación permite comparar señales, se usa mucho para estimar ajustes de curvas a datos experimentales, entre otras aplicaciones. En el caso ideal, cuando la imagen se compara consigo misma, la correlación es uno; cuando las imágenes son totalmente dispares, la correlación vale cero. En este caso, los análisis que más se aproximen a 1 indican mayor probabilidad de tener identificación de nuestro "asesino". 

Ahora bien, nos apoyamos en la obtención del máximo (MAX en Matlab) y luego del promedio (MEAN en Matlab) para tener el valor más representativo de la mayor variación que se puede presentar en el análisis. 

La figura que ilustra este post muestra el  resultado del script --que se presenta al final de la entrada-- . Podemos ver que la comparación de la imagen consigo misma da 1, y que el archivo 3 es el que más se acerca al valor ideal. Mientras que los demás valores están bastante alejados del valor del archivo núm. 3. Por lo cual la identificación es exitosa.

Preguntas para pensar
1) Menciona otras aplicaciones de la función de correlación.
2) ¿Mediante que otra función se puede hacer el análisis de identificación?

Ejercicios
1) A la base de datos de imagenes asocie una base datos con nombres ficticios. (Por ejemplo: alfa, beta, gamma, etc.)   Modifique el guión para que la pantalla le de el nombre del sospechoso más probable.
2) Dibuje sus propios garabatos y haga experimentos. Por ejemplo, a una imagen añada diferentes cantidades y clases de ruido.  Identifique cuales son los limites de este análisis.
3) Sí las imágenes se giran, la identificación es valida. Haga experimentos.
4) La función correlación es la que más tiempo consume en el guion. ¿Cómo puede aumentar el tiempo de calculo para hacer más rápido el proceso?

% INICIO DE GUION EN MATLAB
%Cierra todas las ventanas emergentes, limpia la memoria y la pantalla
close all; clear; clc;
Ases = imread('asesino','jpeg'); %Lee la imágen y la asocia a una matriz
G = fft2(Ases); %Calcula la transformada de fourier en 2D de la imagen
m(13) = mean(max(corr(G,G))); %Se compara la imagen consigo misma

% Con este for cargamos las imagenes, las procesamos y obtenemos un valor
% significativo
for n =1:12
nom_arch=['sospechoso', num2str(n)]; %esta cadena de caracteres cambia como lo hace n
Sosp =imread(nom_arch, 'jpeg'); %se carga la imagen a trabajar
F = fft2(Sosp); % se obtiene la trasformada de Fourier
m(n) = mean(max(corr(F,G))); % Se comparara la imagen con un estándar
%m(i).- Se guarda el valor del i-ésimo sospechoso en la entrada m(i)
end

% Se define el contador x, para graficar
x = 1:13;
% Grafica de x, m. Utilizo puntos rojo y lineas verticales azules
h = stem(x,m,'fill','--');
set(get(h,'BaseLine'),'LineStyle',':')
set(h,'MarkerFaceColor','red')

%Formato de la gráfica
xlabel('Etiqueta para el de sospechoso (número)');
ylabel('Correlación entre imagenes');
axis([0 14 0 1.1]);

% clear
% clc
%fin del script

Cómo hacer interfaces gráficas para usuario (GUI) con guide de Matlab

Imagen vía: smallbiz
Del el documento de CONATEC 2002 hemos visto varios ejemplos del uso de GUIDE para hacer GUI en Matlab, espero que puedan hacer TODOS los ejemplos.

Código Matlab para hacer un contador de franjas de interferencia




Resumen
Esta es una aplicación sencilla de Matlab para analizar imágenes. Se trata de cargar la imagen segmentada de un interferograma - sus franjas de interferencia deben ser verticales -. La imagen se transforma en matriz, se colapsa en vector, y se transforma en datos de ceros y unos. Al barrer la matriz se puede contar el numero de transiciones ,el cual es proporcional al número de franjas.


Muchos de los comandos que se emplean en este ejemplo los hemos explicado en anteriores entradas, y se mencionan sus funciones en el video.

Descarga el archivo: contador_de_franjas.rar que contiene el código, las imagenes originales, y las imágenes segmentedas para que puedas hacer los ejercicios propuestos.

Ejercicios
1) Optimice la velocidad de ejecución de este código. Comience eliminando las lineas de código que no se usan más adelante.
2) ¿Como se pueden eliminar los artefactos de ruido?, de modo que se mejore el desempeño del conteo de franjas
3) Transforme este guión en una función
4) Integre a video este código (esta tarea es avanzada)

Presentación de funciones de transferencia en Matlab

Estas son notas que hemos visto en clase. La idea es que practiquen sus habilidades para hacer código en Matlab.

Si ven un error en la presentación, dejen un comentario ;)

Ejercicio: Jugando al detective CSI con Matlab

He creado una pequeña base de datos de varias imágenes de garabatos. A una de ellas le he llamado asesino, el resto las he llamado sospechoso. El ejercicio consiste en escribir código Matlab para identificar de las imagenes de sospechosos al  patrón que más se parezca a la imagen que llame asesino.

Las imágenes contienen un poco de ruido gaussiano, por lo cual hay que filtrar ese ruido. Dependiendo de su desempeño, se puede hacer más interesante este ejercicio.

Por su puesto estos temas, en la vida real, son más complicados. Las bases de datos son más grandes, se deben de identificar varios puntos de coincidencia, el ruido es mucho, mucho mayor. Con todo, es un buen ejercicio. 

En caso de tener cualquier clase de duda, escriban un comentario en el blog.

Tres ejemplos de matemáticas discretas

Pueden consultar los post relacionados con los temas que vimos el día de hoy:



Por su puesto, revisen a detalle el excelente ejemplo de filtraje de electrocardiogramas. Finalmente, consulten el código para hacer la primera derivada. Uds. pueden hacer el código para hacer la primera integral de una función discreta.

¿Me falto mencionar algo? Dejen un comentario si necesitan más información u omití algo importante. 





Jugando con perfiles e histogramas en imágenes de Matlab

Entregar reporte de resultados, DE ESTA ENTRADA, antes del 19  de septiembre  2012

Las imágenes de prueba están en C:\MATLAB\toolbox\images\imdemos
Pruebe las siguientes funciones:
           
imagen bacteria, archivo
en escala de grises
X = imread('bacteria.jpg','JPG');     % probar al menos tres imágenes distintas
image(X);
colormap(map);
colormap(hot); colorbar;
pause
image(X);
liney=X(:,100);     % column profile (vert)
linex=X(60,:);       % row profile (horiz)
hold on; plot(linex);



Resultado de la primera rutina
1. Pruebe otros perfiles sin exceder las dimensiones de la imagen (recordar “size(X)”) e interprete dichos perfiles en función de la imagen

2.  Los valores de gris de los píxeles de una imagen son una población cuya distribución (frecuencia) permite caracterizar ciertas propiedades de la imagen, sin preservar información espacial (aunque depende de dónde se toman las muestras.   Pruebe las funciones de histograma de una señal, pero ahora en una imagen.   Implemente usted su propia función para calcular un histograma y grafiquelo en diferentes escalas.

Sugerencia (ejercicio: corregir índices definiendo por ejemplo H como subvector de otra matriz ):

% X se define como arriba:  una matriz que contiene la imagen.
H=zeros(256,1);    % iniciar vector de histograma a 0
[m,n] = size(X);    % obtener dimensiones
for i=1:m
  for j=1:n
     H(X(i,j)+1) = H(X(i,j)+1)+1;   % usar datos como direcciones para contra frecuencias
  end
end
plot(H);

3.  Calcule ahora su histograma en escala logarítmica, muestreando la imagen de manera uniforme; pruebe la función random.   Observe los detalles del histograma y pruebe otras escalas.  Comente sus observaciones.

4.  Si N es el total de pixeles, y se muestrean M. Calcule histograma de zonas de interés (un rectángulo que contenga las bacterias, por ejemplo).  Compare con histogramas del fondo en distintas áreas.  ¿Cómo se relacionan con el histograma global?   Repita 4. para una zona de interés (no del fondo).  

6. Compara la implementación de arriba con las funciones de histograma predefinidas en Matlab (úselas).

7.  Aumente el intervalo dinámico de los valores de gris (o sea el contraste) usando la información del histograma (recordar lo que se vio en clase), en uno global y en dos locales.  Para esto será necesario modificar los valores de gris de acuerdo al histograma.

8.   ¿Cómo definir y almacenar  su propia paleta de colores?  Diseñe una que vaya de café obscuro a color crema y de crema azul claro, de azul claro a verde.

Cómo transformar una figura de Matlab en una imagen portable.




Resumen
En esta ocasión se muestran las bases para que nuestras figuras en Matlab se exporten como archivos de imagen y se puedan incorporar en un procesador de textos.
Básicamente, existen cuatro caminos para exportar:

1) El copy-page; en la barra de menús de la imagen, damos clic en Edit y luego en Copy figure. Ya después podemos pegar nuestra información en otro programa, tal vez powerpoint.

2) Salvar como. Utilizando la interface gráfica de la figura Matlab, podemos cómodamente salvar nuestra figura en diversos formatos de imagen (png, pdf, jpg, etc.). Únicamente hay que seguir las instrucciones

3) Uso del comando print. Este comando es muy versátil y permite guarda las imágenes en varios formatos, controlar la calidad de pdi de la imagen e incluso automatizar el proceso de guardar-nombrar archivos. Además de ser el de mayor calidad. Mejor aún, utilizando previamente los comandos:

Set(gcf, ‘InvertHardcopy’, ‘off’)

Así, se preserva el color del fondo que nosotros escogimos previamente para la figura.

4) Impresión de pantalla. En el video omitimos esta opción para salvar las imágenes, pues no es propio de Matlab. El botón de ImprPant es muy general y depende de la resolución de tu monitor, suele mostrar elementos innecesarios que se deberían de corregir en un programa que manipule imágenes. Cuando se trabaja con muchas imágenes y se busca la mejor calidad, este camino se debe evitar

Contar con gráficas de alta calidad visual y de datos es vital para que nuestra publicación, tesis o trabajo escolar sea aprobado por los revisores; por ello no se debe descuidar la presentación de nuestras imágenes.

Preguntas para pensar
1) ¿Qué determina que la imagen sea de alta calidad?
2) ¿Por qué usar 300 dpi en esta clase de imágenes?, ¿Siempre es así?

Ejercicios
1) Introduzca en un ciclo for el comando print, de modo que obtenga 10 imágenes secuenciadas de una senoidal a la que se le varia la frecuencia o la amplitud.

Juntas, pero no revueltas: sub-gráficas en una misma figura de Matlab

Ejemplo del uso de subplot
El comando de Matlab subplot es lo suficientemente versátil para darle sendos ejes y características adicionales a las gráficas que coloquemos en una misma imagen.

Efectivamente, basta con indicar como se compondrá la matriz de la imagen (a,b) y que espacio p ocupará cada una de las gráficas; es decir, subplot (m, n, p) hace la división del espacio de la figura. Matlab asignara el espacio con en paneles regulares para cada gráfica. Este es un ejemplo simple de una rutina aplicada una figura compuesta de 2 gráficas.

Asignación simple de paneles
x= 1:0.1:2*pi;
subplot(2,1,1), plot(x)
subplot(2,1,2), plot(sin(x))

En general, el comando subplot brinda una figura de configuración simétrica de paneles, que son donde se colocan las gráficas. Y cada panel es independiente de los otros. Sin embargo, si el parámetro p es una matriz, entonces se puede ocupar más de un panel para una gráfica. Por tanto, en una misma figura se puede colocar una gráfica grande y otras más pequeñas. Por ejemplo usando el siguiente código:


Asignación asimétrica de paneles
x= 1:0.1:2*pi;
subplot(2,2,[1 2]); plot(sin(x))
subplot(2,2,3); plot(log(x))
subplot(2,2,4); plot(exp(x))

Finalmente, hay que destacar que se puede utilizar el subplot dentro de ciclos de programación, de forma que se pueden automatizar colecciones de imágenes que siguen una línea de historica. Por ejemplo:




Ejemplo del uso de  subplot
en un ciclo for
y = zeros(4,15); % se inicializa un vector, para ser más eficiente
for k = 1:4 % seran cuatro colecciones de datos
y(k,:) = rand(1,15); % se crea un vector de 15 elementos aleatorios
subplot(2, 2, k) % el índice se usa para dar orden a la secuencia de gráficas
plot(y(k,:)); % se hace la gráfica
end

Precauciones
Utilizando scripts, solamente se pueden crear estas gráficas cuando ya se cuenta con la matriz completa. En otro caso hay que utilizar comandos como drawnow, del que ya anteriormente hemos mostrado unos ejemplos.

Preguntas para pensar
1) Describa un ejemplo especifico donde los subplot en un ciclo for son aplicados


Ejercicios
1) Obtenga la siguiente imagen utilizando diferentes comandos de Matlab

Ejercicio de esta entrada

Dibujando gráficas como si fueran animaciones en Matlab

Manos dibujando
Matlab permite fácilmente crear gráficas; pero ¿qué pasa cuando queremos hacer una animación de esa gráfica? Por ejemplo, ir presentado cómo se produce la trayectoria de un cuerpo en movimiento. Con animaciones esta tipo de gráficas son espectaculares en cualquier presentación. En una entrada anterior trate un poco sobre este tema utilizando fotogramas.

Aquí, presentare ejemplos donde no se crea video.

Ingenuamente podemos usar un código simple, como el siguiente.

figure(1);
for i=1:1000
T(i)=cos(i);
plot(T);
end

Efectivamente, aunque no aprovechamos la ventaja de la preasginación de memoria, la idea es que no es importante la velocidad del cálculo, sino que se cuente con la construcción dinámica de la curva; por ello, el comando plot tiene ir dentro del ciclo for.

Sin embargo, hasta este punto, el código es inútil. Pues la reserva de memoria de los cálculos es independiente y asíncrona de la memoria gráfica. Es decir la gráfica se producirá cuando se cuente con el vector completo.  La solución es insertar un comando que actualice todas las ventanas ese comando es drawnow.

Con todo, nuestro código se puede estar ejecutando muy rápido; por lo que hay que añadir dentro del código una pausa (comando pause) al que se le puede controlar el tiempo de ejecución. Digamos que esperamos .3 segundos por iteración. De tal modo que nos da bastante tiempo para ver con comodidad los resultados, pero esto es útil cuando los cálculos son pocos.

Mi ejemplo de código entonces es:

figure(1);
for i=1:1000
T(i)=cos(i);
plot(T);
drawnow;
pause(0.3)
end

El factor comet

El comando comet es otra opción para darle movimiento a la construcción de nuestras gráficas. Sin embargo, para pocos puntos su ejecución es demasiado rápida para apreciarse. Por lo cual se requieren muchos puntos para poder apreciar la construcción. Una alternativa es disminuir el paso entre punto y punto o aumentar el intervalo del vector a graficar. Lamentablemente, este comando no tiene una opción para controlar la velocidad, y aunque se puede alterar el código original para cambiar la velocidad, no es muy recomendable si estas iniciando el arte de hacer código para Matlab.

Pero si sientes que tu experiencia es suficiente para hacerlo, pues te recomiendo ir a los foros del mismo Matlab Central donde te puedes dar una idea de cómo hacer tal alteración: foro1, foro2


El siguiente video te muestra el código y los resultados que obtengo.



Preguntas para pensar 

1) Sin que se cree un video en que casos particulares es más útil esta opción que la de crear un video en Matlab. Revisa nuestra entrada anterior  sobre la  creación de animaciones.

Ejercicios

1)  Realiza una rutina donde se pueda visualizar al mismo tiempo varias gráfica en un una sola ventana, puedes usar el comando subplot

2) Aplica esta solución para ver la dinámica una gráfica de tres variables (X,Y,Z) que cambia con el tiempo.

Uso de operaciones vectoriales en lugar de ciclos for para aumentar el desempeño de Matlab

Consideremos el siguiente ciclo, reescrito directamente de C o Fortran

dx = pi/30;
nx = 1+ 2*pi/dx;
for i = 1:nx
     x(i) = (i-1) * dx;
     y(i) = sin(3*x(i));
end

Todas las declaraciones anteriores son validas en Matlab, pero son ineficientes en el proceso de crear tanto a x como a y. Recordemos, Matlab localiza memoria para las variables cada vez que se les añade un nuevo miembro. Como ya lo comentamos en anteriormente en una entrada sobre reasignación de memoria RAM.
Entonces el mejor modo de crear los mismos dos vectores x y y es mediante los siguientes comandos:

x = 0: pi/30:2*pi;
y = sin(3*x);

La primera declaración crea al vector x; con 61 elementos que son almacenados en zonas continuas del RAM. La segunda declaración crea una nueva matriz, y, con el mismo número de elementos que x.

Matlab está diseñado para desarrollar eficientemente operaciones de matrices y vectores. Para tomar la ventaja máxima del hardware de la computadora; por tanto debemos utilizar operaciones vectoriales lo más que podamos.

Un ejemplo más sofisticado
A pesar que Matlab ajusta automáticamente el tamaño de una matriz (o vector) es mucho mejor predesignar la memoria de la matriz. La preasignación garantiza que los elementos de la matriz se almacenaran en zonas continuas de la memoria RAM y que sólo se realizara una vez este proceso.

Consideremos este ejemplo (que admito es artificial, pero didáctico) para crear dos vectores x y y:

dx = pi/30;
nx = 1 + 2*pi/dx;
nx2 = nx/2;

for i = 1:nx2
    x(i) = (i-1)*dx;
    y(i) = sin(3*x(i));
end

for i = round(nx2):nx
     x(i) = (i-1)*dx;
     y(i) = sin(5*x(i));
end

Aquí, conocemos desde el principio el tamaño de los vectores x y y. Así que reasignaremos la memoria creando un vector antes de que sus elementos sean individualmente asignados. Por lo común se utilizan las funciones ones y zeros para la reasignación de memoria; por ejemplo, de este modo:

dx = pi/30;
nx = 1 + 2*pi/dx;
nx2 = nx/2;

x = zeros(1,nx); % pre-allocate row-vectors, x
y = zeros(1,nx); % and y

for i = 1:nx2
x(i) = (i-1)*dx;
y(i) = sin(3*x(i));
end

for i = round(nx2):nx
x(i) = (i-1)*dx;
y(i) = sin(5*x(i));
end

Sin embargo, las declaraciones x(i) y y(i) no han tomado ventaja de la vectorización, aunque los elementos de x y y han sido almacenados continuamente en la RAM.

Así que mejoraremos estas declaraciones mediante un poco de vectorización. Por ejemplo, escribiendo:

x = 0:pi/30:2*pi; % vectorized calculation of x
nx = length(x);
nx2 = nx/2;

y = x; % pre-allocate memory for y

for i = 1:nx2
     y(i) = sin(3*x(i));
end

for i = round(nx2):nx
    y(i) = sin(5*x(i));
end

Finalmente, podemos observar que los cálculos de y puede también ser vectorizados. Por ejemplo, de este modo:

x = 0:pi/30:2*pi; % vectorized calculation of x
nx = length(x);
nx2 = nx/2;

y = x; % pre-allocate memory for y

y(1:nx2) = sin(3*x(1:nx2)); % compute first part of y
y(round(nx2):nx) = sin(5*x(round(nx2):nx)); % and the second part


En mi computadora, resulta que el aumento de velocidad fue de aprox. 1.2 veces. Es decir, utilizar los cálculos basados en vectores fue notoria la mejora. Sin embargo, en este ejemplo son pocos los elementos de los vectores. Mientras más grande es la matriz o vector, más significativo será utilizar vectorización en lugar de una reconstrucción de la matriz por medio del ciclo for.

Por cierto, para medir el tiempo de estos ejemplos, los he escrito como rutinas (scripts que los nombre ejemplo_vector.m) y utilice los siguientes comandos para medir el tiempo.

clear; tic; ejemplo_vector; disp( ['se tardo ' num2str(toc) 's.'] );

Y la salida de este ejemplo es la siguiente imagen:


Uso de pre-asignación de memoria en Matlab para aumentar la velocidad de cálculos

Fun home 1
Como en cualquier otra actividad, programar requiere seguir reglas para ser efectivo. Del mismo modo en que deberíamos limpiar nuestro cuarto de vez en cuando; debemos economizar la memoria de la computadora.

Por ello, en esta entrada, platicaré de las bases de la preasignacion de memoria (memory preallocation) en Matlab. La preasignación de memoria es una práctica excelente de programación que SIEMPRE debemos seguir.

¿De qué trata la preasignación de memoria en Matlab?

A diferencia de los otros lenguajes de programación, como C; Matlab “cuida” de la asignación de memoria automáticamente. Así cuando ejecutas un programa, Matlab reserva espacios de memoria para los datos de todas las variables que se utilizan. Y esto se basa en información local, de un modo similar como en el caso de los tipos de datos o el espacio necesario para todos los elementos.  Veamos un ejemplo con código Matlab:

X = 1:100;
Y = cos(X);

En la línea 1, Matlab identifica que X es un vector compuesto de 100 elementos de formato doble. Entonces reserva la memoria necesaria para cuando se emplee.

En la línea 2, Y es del mismo tamaño que X, de modo que Matlab reserva memoria antes de llenar el espacio con la información de la función cos(X).

Una consecuencia de este mecanismo es que CADA VEZ que se le pide a Matlab almacenar un nuevo conjunto de datos, Matlab realiza el proceso de asignar algo de memoria. Por ejemplo:

X = 1:100;
X(101) = 1;

En este ejemplo, X está compuesto inicialmente de 100 elementos; luego cuando se le ordena a Matlab que llene el elemento 101, implícitamente se le pide a Matlab que reasigne algo de memoria para que se pueda incluir el nuevo elemento de X.

¿Por qué tanto alboroto con la preasignación de memoria?

Para todos los datos en una matriz, Matlab requiere un proceso de memoria continua. Como resultado, si el espacio de memoria para el espacio 101 es solicitado; entonces Matlab copia todos los valores originales de X y los coloca en un nuevo sitio donde hay espacio para hasta los 101 elementos.

Veamos un ejemplo más extremo, si X esta hecho 100 mil elementos en lugar de 100, el tamaño de memoria para X es grande y estos grandes espacios de memoria no son tan fáciles de localizar. Es como querer estacionar un autobús turístico en el centro de la ciudad… toma bastante tiempo.

Es especialmente en los ciclos for cuando este proceso de asignación de memoria es notorio. Por ejemplo en esta rutina (script) al que llame ejemplo_memoria0:

for i=1: 100000
Y(i)=cos(i);
end

En este caso, a cada paso en el ciclo for, se le pide a Matlab que añada un elemento a la matriz Y. De hecho, se le pide a Matlab que engrose a Y en memoria a cada paso.

Al principio del proceso, es fácil y rápido; pues Y es pequeño. Pero a medida que progresa el ciclo, Y se hace cada vez más grande, de modo que Matlab debe encontrar espacios de memoria mucho más grandes. Por lo que se vuelve una pesadilla de asignare

La solución es simple: preasignación de memoria

La idea se basa en que tú sabes de antemano cual será el tamaño del vector, por ello se lo debes comunicar a la computadora antes de que entre en el ciclo for. Por ejemplo, la mayoría de las personas utilizan funciones como ones o zeros de este modo:


Y = zeros(100000,1);
for i= 1:100000
   Y(i) = cos(i);
end

En mi computadora viejita y sobre-explotada, la primera versión tarda: 21.6511 s; y utilizando la pre-asignación de memoria tarda en ejecutarse: 0.009333 s. Es decir, estos cambios significaron que: ¡¡~688 VECES AUMENTÓ LA VELOCIDAD DEL CÁLCULO!!


Ahora, se puede aumentar la velocidad un poco más. En lugar de gastar el tiempo llenado con ceros una matriz, se le puede pedir a Matlab que llene solamente el último elemento de un vector. Por ejemplo:

Y (100000) =0;
for i= 1:100000
Y(i) = cos(i);
end

En este último caso, la rutina tardo 0.009074 s. Este ahorro de tiempo es especialmente significativo cuando se construyen diversas matrices de gran tamaño.

Preguntas para pensar:
1) ¿Cuáles otras prácticas de programación se deben emplear para aumentar la eficiencia de nuestros programas?

Ejercicios
1) En la línea de comandos de Matlab, yo utilicé los siguientes comandos para medir el tiempo de ejecución de mi rutina:

clear, tic; ejemplo_memoria0; disp( ['se tardo ' num2str(toc) 's.'] );

a) ¿Qué hace los comandos tic y toc?
b) En este caso, ¿Por qué es necesario transformar un número en cadena de caracteres?
c) Crea una tabla con los tres ejemplos mostrados en esta entrada donde se muestre la diferencia de velocidades en los procesos de cálculo,

Próximos temas de graficación en Matlab, curso 2012


Estos son los próximos temas que veremos en la clase presencial. Empezando por el comando mas sencillo de este tema: plot
Les pido que empiecen a hacer gráficas simples y si pueden los ejercicios de la sig. lista de entradas.
  1. Cómo hacer graficas polares (0009) 
  2. Cómo poner una linea de tendencia en Matlab (0014)
  3. Cómo hacer gráficas de funciones z(x,y) (0011) 
  4. Cómo hacer gráficas parámetricas en el espacio con Matlab (0010) 
  5. Cómo variar los colores en una gráfica 3D (0013)
  6. Cómo hacer la animación de una senoidal en función del tiempo (0012)

Funciones y comparación de cadenas de caracteres

Este es un código que muestra como se pueden comparar cadenas caracteres. Es en respuesta a la duda (que se comento en clase) de un ejercicio para la creación de funciones.

Por favor, prueben la función e interpreten el proceso de trabajo, usen los comando tic toc de Matlab para ver cuanto tiempo tarda en ejecutarse, y si pueden modifiquen para disminuir este tiempo.

Y si tienen dudas, pueden dejar un comentario en esta entrada.

%% Esta fucion permite calcular entre la funcion seno y coseno.

% Acepta escalares y matrices
% Si se escribe mal la palabra se termina el programa

function y = trigos(cadena)
display('¿Qué función deseas usar?'); % estos son mensajes para orientar al usuario
display(' ');
display('Escribe la palabra <> si quieres usar la función coseno.');
display('o escribe la palabra <> si quieres usar la función seno');
palabra = input('Cualquier otra palabra te saca de esta funcion \n','s'); % aqui se almacena la cadena

 if strcmp(palabra, 'coseno') == 1 ; % strcmp compara las cadenas, si son iguales da un valor de 1
         y = cos(cadena);
 elseif strcmp(palabra, 'seno') == 1 ;
         y = sin(cadena);
 else strcmp(palabra, 'coseno') || strcmp(palabra, 'seno') == 0 ; % esta parte permite versatilidad en las salidas nulas
         display('la función no esta declarada. Adios :)'); % se le orienta al usuario que sucede en el programa
 end

% fin de la funcion
%%%

Cómo hacer funciones escalares y vectoriales en Matlab (0017)



Resumen
Mostramos los fundamentos de cómo hacer fuciones en Matlab, las cuales pueden trabajar con escalares, vectores y matrices.

Empleamos la palabra reservada de Matlab function para crear una función

Preguntas para pensar 

1) En que casos es recomendable utilizar funciones en Matlab
2) ¿Se debería escribir primero un guion antes de hacer una función en Matlab?

Ejercicios

1) Escribe un archivo .m de la función, fun_es(x), que calcule la siguiente función:


El argumento debe aceptar tanto un escalar como un vector. Pruebe su función tecleando en la ventana de comandos de Matlab: fun_es(3) y fun_es([1 2 3])

2) Repita la tarea del ejercicio 1) para la función


Denote la función por fun_lg(x).

3) Se supone que el lector ya creó las funciones fun_es y fun_lg de los problemas 1) y 2). Ahora, cree una función f_es(x) que:


pregunte el nombre de la función que se desea evaluar,
 permita al usuario teclear el nombre de la función,
 evalúe la función con el comando de Matlab feval y devuelva los valores funcionales y
se detenga si la fucnion indicada por el usuario no es fun_es ni fun_lg.

Pruebe su f_es calculando fun_es(3) y fun_lg(3).

Tres ejercicios sobre creación de funciones en Matlab

Estos ejercicios son para comprobar nuestro conocimiento en la creación básica de funciones.

1) Escribe un archivo .m de la función, fun_es(x), que calcule la siguiente función:


El argumento debe aceptar tanto un escalar como un vector. Pruebe su función tecleando en la ventana de comandos de Matlab: fun_es(3) y fun_es([1 2 3])

2) Repita la tarea del ejercicio 1) para la función


Denote la función por fun_lg(x).

3) Se supone que el lector ya creó las funciones fun_es y fun_lg de los problemas 1) y 2). Ahora, cree una función f_es(x) que:


pregunte el nombre de la función que se desea evaluar,
 permita al usuario teclear el nombre de la función,
 evalúe la función con el comando de Matlab feval y devuelva los valores funcionales y
se detenga si la fucnion indicada por el usuario no es fun_es ni fun_lg.

Pruebe su f_es calculando fun_es(3) y fun_lg(3).

Cómo poner un cross-hair (cursor de línea) en las figuras de Matlab

Gráfica con tres cursores de linea
Cuando requerimos explorar una gráfica es una gran ayuda contar con un cursor de línea (cross-hair) vertical o horizontal.
graphics.cursorbar, que es un objeto interno de Matlab, es una solución para tener tal aditamento en nuestras gráficas.

Se inicializa el graphics.cursorbar al sustituir un eje (lo que no es muy útil), o graficando una línea (que es más inteligente). Este objeto se puede personalizar utilizando propiedades como BottomMarker, TopMarker, CursorLineColor, CursorLineStyle, CursorLineWidth, TargetMarkerSize, TargetMarkerStyle, ShowText, Orientation, Position (la cual es una propiedad oculta), entre otras.

Ahh!, por supuesto, también están presentes las propiedades regulares (UserData, Visibility, Parent etc.).
Una vez que el cursor de línea es creado, este puede ser movido por medio del cursor del raton, como el código muestra:

%%%% inicia código
x=0:.01:7; y=plot(x,sin(x));
hCursorbar = graphics.cursorbar(y); drawnow
hCursorbar.CursorLineColor = [1,.2,.3]; % default=[0,0,0]='k'
hCursorbar.CursorLineStyle = ':'; % default='-'
hCursorbar.CursorLineWidth = 1; % default=1
hCursorbar.Orientation = 'vertical'; % =default
hCursorbar.TargetMarkerSize = 10; % default=8
hCursorbar.TargetMarkerStyle = 'o'; % default='s' (square)
%%%% fin del código

Ahora bien, en muchas gráficas se puede desear tener dos o más cursores de línea. Por ejemplo una horizontal y otra vertical (x,y), o bien dos verticales (x_1, x_2); esto se puede hacer en base del sig. código:

x=0:.01:7; y=plot(x,sin(x));
hCursorbar1 = graphics.cursorbar(y);
hCursorbar2 = graphics.cursorbar(y);
% ahora a personalizar la apariencia de hCursorbar1 y a hCursorbar2

Preguntas para pensar
1) Menciona dos aplicaciones especificas y concetras donde es importante tener esta aditamento gráfico


Ejercicios
3) Crea un imagen con dos subgráficas donde esten contenidas dos sendos cursores en linea. Es decir en total tendremos cuatro cursores de linea.
4) En una interface de usuario con gráfica introduce estos cursores de linea.

Primeras actividades a realizar antes del 14 de agosto

FOTO:
WWW.SHUTTERSOTCK.COM/THOMAS M PERKINS
Estas son las primeras actividades que deben realizarar antes de la siguiente clase presencial.

Recuerden que estos temas serán parte de la primera evaluación que realizaremos la siguiente semana. En caso tener alguna duda, dejen un comentario en este post.


2. Observen y realicen TODOS los ejercicios de los siguientes posts, que tratan sobre operaciones básicas en Matlab
  1. Cómo escribir operaciones básicas en Matlab (0001)
  2. Cómo escribir fórmulas básicas en Matlab (0002)
  3. Cómo escribir matrices en Matlab (0003)
  4. Matrices como variables en Matlab (0004)
  5. Suma de vectores y matrices en Matlab (0005)
  6. Multiplicación de matrices (0006)
  7. División entrada a entrada y división de matrices en Matlab (0007)

¡Bienvenidos a su blog didáctico de programación en Matlab!

Este blog tiene la intención de apoyarte académicamente en la clase de programación en Matlab. Por ello es importante que realices las actividades online que a partir de este post se incluirán. Además del material adicional que te ayudara en la clase: videos, notas, calificaciones, hojas de cálculo para hacer trabajo colaborativo. Adicionalemte, en este blog encontraras fechas importantes para el curso, notas y otra información importante. Ciertamente, el blog es un medio de comunicación, por lo cual esperamos que tanto en la clase presencial como en este espacio participes con tus recomendaciones a material didáctico extra que puede ayudarnos a dar un mejor curso.
Recuerda el la clase la hacemos todos =) .
Bienvenido al curso y esperamos que aprendas muchas cosas nuevas, útiles y divertidas ^_^ .

Usos y abusos de la barra de espera de Matlab

La barra de espera de Matlab es un adorno. Le da la sensación al usuario que algo está sucediendo mientras espera que su programa se ejecute. Sin embargo, al ser un complemento que se ejecuta y despliega un gráfico, pues consume memoria de la computadora. Si se ejecuta el Profiler se puede observar cuanta memoria consume, gasto que es significativo en pequeños programas, y tal vez sea necesaria para programas elaborados y que sean para usuarios finales. El código de la barra de espera es:

h=waitbar(0,'Por favor, espere...');
FindelCiclo=4000;
for i=1:FindelCiclo
waitbar(i/FindelCiclo,h); % calculos
end
delete(h);

Preguntas para pensar 
1) Si los complementos en los programas de computo gastan memoria. ¿Por qué se utilizan?, ¿Se puede demostrar su efectividad o que mejoran la amigabilidad de un programa?

Ejercicios 
1) Introduce una barra de espera en un programa grande previamente elaborado, y utiliza los comandos tic toc para calcular la diferencia de tiempo antes y después de emplear la barra de espera.

Temas de este tutorial de Matlab


A manera de temario, he escrito de que tratan los primeros videos de este blog. Creo que puede ser útil para seguir un curso de programación en Matlab o bien para un autodidacta o entusiasta de este programa.

Material adicional
  1. Importando y manipulando datos entre Matlab y Excel (0016)
  2. Cómo hacer páginas html de los scripts de Matlab (0015)
  1. Cómo poner una linea de tendencia en Matlab (0014)
  2. Cómo variar los colores en una gráfica 3D (0013)
  3. Colocar muchas gráficas en una sola imagen (1) 
  4. Cómo hacer gráficas de funciones z(x,y) (0011)
  5. Cómo hacer gráficas parámetricas en el espacio con Matlab (0010)
  6. Cómo hacer graficas polares (0009)
  7. Cómo hace imagenes portables de las figuras (0019
  8. Cómo hacer la animación de una senoidal en función del tiempo (0012)
  9. Trazando gráficas como si fueran animaciones (0018)

Programación básica
  1. Cómo hacer funciones en Matlab (0017)
  2. Uso de estructuras selectivas de programación (próximamente)

Operaciones Básicas
  1. División entrada a entrada y división de matrices en Matlab (0007)
  2. Multiplicación de matrices (0006)
  3. Suma de vectores y matrices en Matlab (0005)
  4. Matrices como variables en Matlab (0004)
  5. Cómo escribir matrices en Matlab (0003)
  6. Cómo escribir fórmulas básicas en Matlab (0002)
  7. Cómo escribir operaciones básicas en Matlab (0001)

Importando y manipulando datos entre Matlab y Excel (0016)




Resumen
Se muestra cómo importar datos de Excel a Matlab, y como se pueden manipular datos de Excel desde Matlab.
Empleamos los comandos xlsread y xlswrite

Preguntas para pensar
1) ¿En qué casos es importante que un programa de computo sea flexible para que comparta datos con otros programas?
2) ¿Cuál es la importancia del código ASCII en el desarrollo de los programas de computo?

Ejercicios
1) Crea un libro de Excel que contenga una sola múltiples columnas, mínimo dos columnas. desde Matlab, manipula una de esas columnas.

Toma en cuanta que Matlab puede crear vectores fila o columna.

Cómo hacer páginas html de los scripts de Matlab (0015)



Resumen
Mostramos como hacer documentación para nuestros guiones/scripts de Matlab. Así, se obtiene por medio del comando help, de la ventana de comandos, una breve ayuda; pero además se crea una página html que se puede ver en el navegador, esta página puede presentar ecuaciones, imagenes, hipervinculos, crea una tabla de contendios, entre otras cosas.  

Preguntas para pensar
1) ¿Cuál es el beneficio para el usuario de que se tenga documentación en la ventana de comandos y además en una presentación tipo html?
2) ¿La documentación para un programador es diferente que la que necesita un usuario? 

Ejercicios
1) A uno de tus viejos programas de Matlab, añade comentarios, y usa la sintaxis adecuada para tener una ayuda lo más completa posible para que se despliegue en la ventana de comandos. A la vez, la información que se presnte en el navegador debe contener imagenes archivadas, hipervinculos, ejemplos del uso del programa.

Cómo poner una linea de tendencia en Matlab (0014)



Resumen
Mostramos que es muy fácil obtener una linea de tendencia en un gráfico de dispersión. Basta utilizar la interfaz cómoda de Matlab, la que se accede vía la ventana del gráfico. Sin embargo, se pueden utilizar el comando  la serie de comandos:
p=polyfit(x,y,1)  % realiza el ajuste lineal en las matrices x, y que contiene los datos
R=corrcoef(x,y); % 
R(1,2)

Preguntas para pensar
¿Cuál es la relación entre el coeficiente de correlación y la covarianza?
¿Por qeé esta acotado entre 0-1 la correlación?

Ejercicios
1) Al una serie de datos simulados x,y, introduce un pequeño ruido aleatorio. Calcula la linea de tendencia y su coeficiente de correlación.
2) Ahora, a los datos anteriores introduce un reuido aleatorio grande.  Calcula la linea de tendencia y su coeficiente de correlación.
3) Finalmente a datos simulados tales que la ecuación corresponda a y = x^2 realiza un ajueste lineal y el ajuste cuadratico. Compara los coeficientes de correlación.
4) Reflexiona sobre el uso e importancia del ajuste de correlación para validar el uso de una linea de tendencia. Te recomendamos leer: 5 ejemplos sencillos sobre la correlación y ajuste de líneas, con Excel.

Cómo variar los colores en una gráfica 3D (0013)



Resumen
Se muestra cómo colocar una barra que indique numéricamente el significado de un color en una gráfica tridimensional. Además de cómo manipular los colores, e incluso cómo personalizar estos colores segun nuestra necesidad.

Los comandos que se utilizan son: colorbar, colormap, colormapeditor, shading, rotate3d,

Preguntas abiertas
¿En que casos es adecuado presentar graficas 3D con colormap lines?, ¿en que casos NO es adecuado usar colormap lines?

Ejercicios
Diseñe con colormapeditor su propia escala de colores.

Cómo hacer la animación de una senoidal en función del tiempo (0012)



Resumen
Vamos a dibujar la gráfica de la curva Y = A sin(x) para varios valores de A contenidos en el intervalo de [-1 1]. Como se muestra en el video, el núcleo del programa es el bucle (comandos que repiten una instrucción). De hecho, para cada valor de j se obtiene un fotograma.

Los comandos claves en esta ocasión son: getframe, movie.

Preguntas abiertas
¿Cuál es la función de (pi/49) en el código?
¿Tiene sentido registrar con getframe tiempos muy cortos en el tiempo (e.g. ms)?

Ejercicios
1) Mediante ecuaciones parametricas realiza la animación  una elipse que varia el tamaño de uno de sus ejes. Como se muestra en el sig. video



2) Realiza la animación del movimiento de un resorte en MAS y luego de un péndulo con oscilaciones amortiguadas.

Cómo hacer graficas polares (0009)



Resumen
Mostramos con ejemplos cómo hacer gráficas en coordenadas polares; mediante el comando polar. Además, mostramos comandos para cambiar coordenadas polares a cartesianas (pol2cart) y viceversa (cart2pol).


Preguntas abiertas
1. ¿Qué otros sistemas de coordenadas son popularmente empleados?
2. ¿En que aplicaciones concretas son usados las coordenadas polares? 


Ejercicios
1. Dibuja las gráficas de las siguientes funciones, dadas en coordenadas polares
a)

b)

c)


2. En los ejemplos del ejercicio anterior, utiliza  comando  pol2cart para cambiar cambiar el espacio de coordenadas. Después utiliza  el comando plot para obtener las gráficas en el sistema cartesiano.

Cómo hacer gráficas de funciones z(x,y) (0011)



Resumen
Se muestran con ejemplos los comandos para generar gráficas 3D de funciones dos funciones: plot3, mesh y surf. Además se muestra el uso de shading flat para presentar mejor la gráfica y del boton de rotación de perspectiva para mejorar la apariencia de la vizualización

Preguntas Abiertas
¿Cómo se pueden representar gráficamente funciones más de dos variables? No considere la películas/animaciones.

Ejercicios
Obtén las gráficas de las siguientes funciones de 2 variables, utilizando los comandos antes descritos
a)

b)

c) 

Cómo hacer gráficas parámetricas en el espacio con Matlab (0010)



Resumen
Presentamos el uso de tres comandos: plot3, comet3 y quiver3 para visualizar curvas parámetricas en tres dimensiones. plot3 permite hacer una gráfica simple, mientras que coment3 realiza una animación, quiver presenta los vectores velocida de la curva.

Preguntas abiertas
¿Cómo es la sintaxis matemática para presentar los vectores velocidad?
¿Cómo se presentarían los vectores acelereración?

Ejercicios
Representa las curvas siguientes en gráficos aparte, toma en cuenta los intervalos indicados.

a) 

b) 

c) 
Related Posts Plugin for WordPress, Blogger...