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 =

1
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 = [1 ; 2 ; 3]

a =
1
2
3
Matriz
a = [1 2 3 ; 4 5 6; 7 8 9]

a =
1 2 3
4 5 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 2 3 ; 4 5 6; 7 8 9]

a =
1 2 3
4 5 6
7 8 9

b = [9 8 7 ; 6 5 4; 3 2 1]

b =
9 8 7
6 5 4
3 2 1

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 -6 -4
-2 0 2
4 6 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 28 10
118 73 28
190 118 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 2 3 ; 4 5 6; 7 8 9]

a =
1 2 3
4 5 6
7 8 9

b = [9 8 7 ; 6 5 4; 3 2 1]

b =
9 8 7
6 5 4
3 2 1

c =a.*b

c =

9 16 21
24 25 24
21 16 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.2500 0.4286


0.6667 1.0000 1.5000
2.3333 4.0000 9.0000
c=b.^a

c =

9 64 343
1296 3125 4096
2187 256 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 2 3
4 5 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 =
2

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 3
5 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; % cierra todas las ventanas


clear all; % Borra todas las variables

N=50; % Numero de muestras

v=randn(1,N); % Armo un vector de 10 muestras aleatorias independientes


% distribuidas normalmente (media nula y varianza unitaria)

u=zeros(1,N); % Por comodidad inicializo el vector donde voy a guardar


% los resultados

for k=1:N, % Para k variando en el rango 1..N

if((k>1) & (k<10)), % Si estoy en los elementos centrales


u(k)=1/3*(v(k-1)+v(k)+v(k+1)); % promedio normalmente

elseif (k==1), % Si estoy en el primer elemento


u(k)=1/2*(v(k)+v(k+1)); % promedio con el siguiente solamente

else % Si estoy en el ltimo (no queda otra)


u(k)=1/2*(v(k-1)+v(k)); % promedio con el anterior solamente

end % Fin del IF

end % 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