You are on page 1of 16

Matlab para Probabilsticos

Cmo trabaja Matlab?


Matlab es un lenguaje intrprete que est basado esencialmente en el manejo numrico de la informacin. A diferencia de otros programas como Mathematica o MathCad, no permite trabajar con expresiones matemticas simblicas (salvo libreras que lo simulan). Esto que en un principio parece una desventaja, termina siendo una de las mayores virtudes de Matlab. Muchas veces que encaramos una situacin problemtica, tendemos a desarrollar modelos analticos para entender la naturaleza del problema, y al resultar demasiado complejos de analizar, los reducimos a modelos lineales, que son fcilmente manipulables. Este enfoque puede funcionar muchas veces, pero a menudo carece de exactitud. El enfoque numrico nos permite justamente llegar a resolver problemas complejos analticamente con una serie de tareas simples y repetitivas, siendo firmes candidatos a ser realizadas por computadora, logrando una precisin tan grande como el tiempo de procesamiento y la misma precisin de la mquina nos lo permitan.

El entorno de Matlab
No hay persona que al entrar a Matlab por primera vez se haya sentido desilusionada. Todo lo que se ve es una lnea de entrada de comandos esperando. Matlab solo ejecuta rdenes. Es nuestro pequeo esclavo numrico. Estas rdenes pueden comunicarse de dos formas: Directamente en la lnea de comandos

Ud.: lstrame los zapatos Matlab: S Amo Ud.: ahora abancame Matlab: Si, Amo Mediante una receta preestablecida llamada script

Ud. le da a Matlab un papiro que dice: Esclavo Matlab, estas son las tareas que le encargo en el da de la fecha: a) Lstrame los zapatos b) Abancame De no cumplir con las tareas correctamente ser degollado al amanecer

Firmado, El Amo Es recomendable dar los primeros pasos dando rdenes directas ya que podemos ir apreciando la consecuencia de cada orden. A la hora de escribir un programa completo, la segunda forma es la ms adecuada, ya que en el proceso de depurar el programa no es necesario escribirlo de nuevo cada vez que queramos ejecutarlo.

Lnea de comando

La lnea de comando de Matlab permite tambin realizar algunas operaciones del ya casi extinto DOS anteponiendo el smbolo de admiracin (!) a la instruccin Por ejemplo
>>!ren fulano.m mengano.m

Cambia el nombre del archivo fulano.m a mengano.m

El workspace (lugar de trabajo)


El workspace es una metfora del espacio de memoria que contiene a todas las variables con las que est trabajando. Al cerrarse Matlab toda esta preciosa informacin se pierde, por lo que es, nuevamente, recomendable el uso de programas preescritos (scripts) para volver a generar toda la informacin. De todas formas, Matlab permite grabar en un archivo el estado del workspace.

Matlab Path
Una de las primeras tareas a realizar cuando nos dispongamos a empezar a trabajar es crear un directorio o carpeta de trabajo para trabajar ms cmodamente. Luego de crearlo, lo ponemos como directorio local (current directory). Cada vez que se ejecute un comando, este ser el primer lugar donde lo busque y si no esta all, Matlab buscara en su listado de paths.

Las Libreras
Una librera es una serie de funciones (archivos *.m) que permiten encarar determinados problemas. Existen libreras de procesamiento de seales, de manejo simblico de datos (cosa que Matlab no

debera por qu hacer pues es un simulador numrico), y de todo tipo de manejos esotricos que no vienen al caso. Una de las ventajas de Matlab, es que su cdigo es abierto. Esto quiere decir que cualquier funcin de las libreras, estndar o no, puede ser editada y modificada. Es decir que una funcin cualquiera que ya venga incluida en el paquete no difiere demasiado de una funcin que nosotros podamos escribir (esto fue cambiando un poco ya que cada vez mas se usan .dll pero el grueso sigue siendo .m)

Matlab Editor/Debugger
Matlab cuenta con un editor de texto, que tambin efecta acciones de debugging, en donde pueden escribirse los scripts. El editor resalta en distintos colores las palabras reservadas, las cadenas de string, y no me acuerdo que otra cosa.

Help!
Este comando nos permite solicitar ayuda sobre cualquier comando o funcin que se encuentre instalada en Matlab. Escribiendo help en la lnea de comando, el programa devuelve un listado de todas las libreras instaladas. Entonces:
help

Para pedir mas detalles sobre las funciones que pertenecen a una librera dada, ingresamos help seguido del nombre de la librera. Por ejemplo:
help stats

La librera stats agrupa diferentes rutinas tiles en probabilidad y estadstica. Resulta muy instructivo echarle una mirada. Al final de la ayuda nos remite a algunos temas relacionados para que podamos continuar la bsqueda, si es que no terminamos de encontrar lo que buscbamos. Si quisiramos ver con mas detalle algn tem de la lista, basta con escribir help <tem>. Ejemplo:
help normpdf NORMPDF Normal probability density function (pdf). Y = NORMPDF(X,MU,SIGMA) returns the pdf of the normal distribution with mean MU and standard deviation SIGMA, evaluated at the values in X. The size of Y is the common size of the input arguments. A scalar input functions as a constant matrix of the same size as the other inputs. Default values for MU and SIGMA are 0 and 1 respectively.

Ante cualquier duda sobre el help tipeen:


help help

Hay otro modo de ayuda, un poco mas cmodo, que se puede acceder desde el men desplegable Help. El contenido es el mismo que el de la lnea de comandos, solo que disponemos de un pequeo navegador. Matlab cuenta tambin (en sus versiones ms recientes) con una enorme cantidad de archivos de ayuda en formato PDF o HTML. Son muy instructivos pero algo largos.

Trabajando con vectores y matrices


Vale la aclaracin de que, para Matlab, los escalares son una matrices de 1x1. Por lo que las operaciones son vlidas tambin para ellos. Creacin de vectores y matrices Una particularidad de Matlab es que no es necesario declarar las variables. El espacio de memoria se ajusta dinmicamente en cada asignacin. Por lo que podemos hacer lo siguiente:
a = 1 a =

y a continuacin sobrescribirlo,
a = [1 2 3] a = 1 2 3

Para crear manualmente vectores y matrices se encierra los elementos entre corchetes, y se usan comas o espacios para separar elementos que estn en la misma fila, y punto y coma para separar las diferentes filas. Vector fila
a = [1 2 3] a = 1 2 3

Vector columna
a = a =

[1 ; 2 ; 3] 1 2 3

Matriz
a =

a = [1 1 4 7

2 2 5 8

3 ; 4 3 6 9

6; 7 8 9]

Nota: zeros(), ones() - Estas funciones permiten crear matrices rellenas de ceros o de unos. Para conocer ms sobre la sintaxis:
>> help zeros

>> help ones

Operaciones matriciales bsicas


Suma y Resta Se usan los mismos operadores que en el caso de sumas y restas escalares (+ y -). La operacin se realiza elemento a elemento, por lo que los vectores/matrices deben ser de dimensiones compatibles, con la excepcin de que uno de ellos sea un escalar. Ejemplo: Definimos las matrices a y b:
a = [1 a = 1 4 7 8 8 5 2 2 2 5 8 3 ; 4 3 6 9 7 ; 6 7 4 1 5 4; 3 2 1] 5 6; 7 8 9]

b = [9 b = 9 6 3

Para efectuar la suma:


c = a+b c = 10 10 10 10 10 10 10 10 10

Para la resta:
d = a-b d = -8 -2 4 -6 0 6 -4 2 8

Producto matricial El operador producto es el asterisco ( *). Nuevamente los operandos deben ser de dimensiones compatibles. Ejemplo Con las matrices del ejemplo anterior
e = a*b' e = 46 118 190 28 73 118 10 28 46

Transponer una matriz o un vector El operador de transposicin es la comilla simple ( ). Transponer significa intercambiar filas por columnas. Una aplicacin sera efectuar un producto interno. Siendo a y b vectores columna, se define el producto interno como: <a,b>=aT*b Donde T denota transposicin. El resultado de <a,b> es un escalar. Ejemplo:
a = [1 ; 2 ; 3]; b = [3 ; 2 ; 1]; c = a'*b c = 10

Nota: Un punto y coma al final de una sentencia hace que no se vea el resultado de la operacin. Esto es muy importante, porque Matlab tiene la molesta costumbre de ir mostrando todos los resultados obtenidos. El punto y coma nos permite filtrar los resultados parciales y en todo caso solo mostrar aquellos que sean de nuestro inters.

Operaciones elemento a elemento Matlab define algunas operaciones que sern realizadas elemento a elemento. Ya vimos anteriormente que la operacin A*B realizaba el producto matricial. Pero que pasa si queremos que cada elemento de A quede multiplicado por cada elemento de B (suponiendo que tienen las mismas dimensiones)? Existe otro operador para tales fines: Definimos las matrices a y b:
a = [1 a = 1 4 7 8 8 5 2 2 2 5 8 3 ; 4 3 6 9 7 ; 6 7 4 1 5 4; 3 2 1] 5 6; 7 8 9]

b = [9 b = 9 6 3 c =a.*b c = 9 24 21

16 25 16

21 24 9

Como se ve, si anteponemos un punto al operador, la operacin se realiza elemento a elemento. La divisin ( /) y la potencia (^) tambin permiten esta utilizacin.
c=a./b c = 0.1111 0.6667 2.3333 0.2500 1.0000 4.0000 0.4286 1.5000 9.0000

c=b.^a c = 9 1296 2187 64 3125 256 343 4096 1

Otras operaciones pueden ser consultadas en la librera ops: Concatenacin de vectores y matrices Supongamos que queremos formar una matriz con diferentes vectores y/o matrices de dimensiones compatibles, o queremos unir dos vectores para formar uno mas largo. Esto puede realizarse rpidamente de la siguiente manera: Comencemos generando dos vectores fila a y b:
a = [1 2 3]; b = [4 5 6];

Podemos concatenarlos de varias maneras... Si los unimos uno a continuacin del otro:
c = [a b] c = 1 2 3 4 5 6

Notar que al separar a y b por un espacio estamos diciendo que ambos pertenecen a la misma fila, por lo que es entendible el resultado obtenido. Si por el contrario, interponemos un punto y coma entre ambos:
c = [a ; b] c = 1 4 2 5 3 6

Matlab coloca cada vector en una fila diferente. Operador de rangos

Para generar un vector cuyos elementos sean nmeros crecientes o decrecientes en un intervalo regular existe el operador : (dos puntos). El uso ms sencillo de este operador sera: <Mnimo>:<Mximo> Ejemplo:
a = 1:4 a = 1 2 3 4

Si queremos especificar un intervalo determinado, escribimos: <Mnimo>:<Intervalo>:<Mximo> Ejemplo:


a = 1:0.5:4 a = 1.0000 1.5000 2.0000 2.5000 3.0000 3.5000 4.0000

Y si queremos que el rango sea decreciente slo escribimos el intervalo negativo. Ejemplo
a = 4:-0.5:1 a = 4.0000 3.5000 3.0000 2.5000 2.0000 1.5000 1.0000

Indexacin Matlab permite acceder a un elemento o un conjunto de elementos de una matriz o un vector de una manera muy eficiente. Definamos la matriz a:
a=[1 2 3;4 5 6; 7 8 9];

Si queremos acceder al elemento a(1,2) (fila1 y columna 2 de a) y guardarlo en una variable nueva llamada a12:
a12=a(1,2) a12 =

Nota: Matlab no admite el cero como ndice de vectores ni matrices !!!! Pero que pasa si pretendo recuperar toda una fila o una columna, o hasta una submatriz contenida en a?. Veamos, para recuperar un conjunto de elementos debemos asignar rangos a las filas y columnas. Si busco la fila 1:
f1=a(1,1:3) f1 = 1 2 3

Esto se lee as: Quiero todos los elementos que se encuentren en la fila 1 y en las columnas de 1 a 3 inclusive . Existe una manera mas compacta de escribir la misma sentencia. Se puede usar una suerte de comodn (:) que indica que quiero todas las filas o todas las columnas.
f1=a(1,:) f1 = 1 2 3

Esto se leera como: Quiero los elementos de la fila 1 sin importar en que columna estn De igual manera, para recuperar una columna cualquiera, la 2 por ejemplo:
c2=a(:,2) c2 = 2 5 8

Donde c2 es ahora un vector columna. Para indexar un vector, no importa si es fila o columna:
f1_1=f1(1) f1_1 = 1

Donde el primer elemento de f 1 queda guardado en la variable f 1_1 Por ltimo se puede acceder a una submatriz de a:
sa=a(1:2,2:3) sa = 2 5 3 6

Donde rescatamos las primeras dos filas y las dos ultimas columnas.

Funciones tiles de Matlab


Comandos relacionados con el workspace. clear: borra todas las variables del entorno who: devuelve una lista de las variables que estn en memoria load: carga el workspace desde un archivo. save: guarda el workspace en un archivo. Comandos relacionados con tamao de datos length(): se aplica solo a vectores. Devuelve el largo del vector (es igual para filas y columnas). size(): se aplica tanto a vectores como matrices. Devuelve un vector de dos elementos: cantidad de filas y cantidad de columnas. Funciones matemticas tiles sqrt(): Calcula la raz cuadrada de un nmero, vector o matriz. (elemento a elemento) Comandos de control de flujo for: e if-elseif-else: son los clsicos de Pascal, C, Logo...? Comandos relacionados con la salida grfica de datos figure(): abre una ventana grfica close(): cierra una ventana grfica plot(): grafica una serie de datos (x,y) sobre la figura activa. stem(): es igual que Plot() solo que no conecta los puntos entre s. hold on: permite ir superponiendo diferentes graficas en una misma figura Funciones estadsticas mean(): calcula la media de un vector cov(): calcula la varianza de un vector normcdf(): evala en una serie x (vector) de valores la funcin de acumulacin de una variable aleatoria normal de media u y varianza sigma. Nota: Todos los comandos deben estar siempre en minscula. Para obtener una descripcin detallada de la sintaxis utilicen el help... no me hagan escribir.

Sentencias de control de flujo + Ejemplo


Las sentencias for e if-elseif-else Supongamos que queremos recorrer un vector elemento a elemento y realizar una operacin sobre cada uno. Por ejemplo, quiero suavizar una seal promediando el k-esimo valor con el (k+1)-esimo y el (k-1)-esimo . Este tipo de operaciones son un poco mas complicadas de realizar operando matricialmente. Por lo que, por simplicidad se prefiere el for en este caso. Pero tenemos que ser conscientes de que un for insume mas tiempo de cmputo que una operacin matricial !!. Por lo que, si trabajamos con un gran numero de datos, el for puede resultar demasiado lento (y peor an cuando hay sentencias for anidadas), y puede que nos veamos en la necesidad de encarar el problema de otra forma. Vamos al problema... Como este cdigo necesita varias lneas es preferible crear un archivo script (*.m) para guardar el programa completo. Asegurense de copiar el archivo al current directory o a un directorio que est incluido en el MatLabPath para que puedan ejecutarlo.
%%%%%%%%%%%%%%%% Promediador close all; clear all; N=50; v=randn(1,N); u=zeros(1,N); for k=1:N, if((k>1) & (k<10)), u(k)=1/3*(v(k-1)+v(k)+v(k+1)); elseif (k==1), u(k)=1/2*(v(k)+v(k+1)); else u(k)=1/2*(v(k-1)+v(k)); end end % cierra todas las ventanas % Borra todas las variables % Numero de muestras % Armo un vector de 10 muestras aleatorias independientes % distribuidas normalmente (media nula y varianza unitaria) % Por comodidad inicializo el vector donde voy a guardar % los resultados % Para k variando en el rango 1..N % Si estoy en los elementos centrales % promedio normalmente % Si estoy en el primer elemento % promedio con el siguiente solamente % Si estoy en el ltimo (no queda otra) % promedio con el anterior solamente % Fin del IF % Fin del FOR

figure(1); % Abro una ventana grfica con el nmero (1) plot(v,'b'); % Dibujo el vector v en azul hold on % retengo el dibujo para que no se sobreescriba plot(u,'r'); % Dibujo el vector u en rojo title('Seal original (azul) - seal filtrada (rojo)');

La nica salida del programa es este grfico:

Como se puede apreciar, la curva roja se saltea algunos picos de la original, por lo que parece anuvo noms...

Fine

You might also like