Professional Documents
Culture Documents
Introduccin a MATLAB
Introduccin a MATLAB
2012
0 Contenido
0
Contenido .............................................................................................................................. 1
Qu es MATLAB? ................................................................................................................. 2
1.1
1.2
2.1.1
3
3.2
Operaciones lgicas....................................................................................................... 7
3.3
Variables ........................................................................................................................ 7
3.4
3.5
4.1.1
4.1.2
4.1.3
4.1.4
Concatenacin ..................................................................................................... 10
4.2
4.2.1
4.2.2
4.2.3
4.2.4
4.3
4.3.1
Traspuesta ........................................................................................................... 15
4.3.2
4.3.3
4.3.4
Funciones ............................................................................................................ 16
4.4
4.4.1
4.4.2
Polinomios ........................................................................................................................... 19
Robtica Industrial
Prctica 1
Introduccin a MATLAB
6
2012
6.2
6.2.1
6.2.2
Subplot ................................................................................................................ 21
6.2.3
6.2.4
Un pequeo ejemplo........................................................................................................... 25
Programacin ...................................................................................................................... 28
8.1
Control de flujo............................................................................................................ 28
8.1.1
8.1.2
8.2
8.2.1
Estructuras .......................................................................................................... 34
8.2.2
8.2.3
8.2.4
8.3
8.3.1
Scripts .................................................................................................................. 38
8.3.2
Funciones ............................................................................................................ 38
8.4
1 Qu es MATLAB?
MATLAB es un potente entorno para la realizacin de los clculos necesarios para resolver
problemas cientficos y de ingeniera. El nombre es la abreviacin de MATrix LABoratory,
porque el sistema se dise para hacer especialmente fciles los clculos con matrices. Sus
caractersticas lo hacen muy efectivo en el desarrollo de algoritmos, visualizacin de datos,
anlisis de datos y clculo numrico de una manera mucho ms rpida que con lenguajes de
programacin tradicionales como C, C++ o Fortran.
Algunas caractersticas de MATLAB:
Es un sistema interactivo.
MATLAB soluciona los problemas asociados con tareas de la resolucin numrica de
los clculos, lo que facilita centrarse en la bsqueda de soluciones al problema que se
desea resolver.
Robtica Industrial
Prctica 1
Introduccin a MATLAB
2012
Lenguaje : Es un lenguaje de alto nivel para operaciones con matrices / arrays, con
instrucciones de control de flujo, funciones, estructuras de datos, entrada/salida de datos, e
incluso caractersticas de programacin orientada a objetos. Permite tanto:
Robtica Industrial
Prctica 1
Introduccin a MATLAB
2012
Grficos : MATLAB incluye muchas herramientas para visualizar vectores y matrices como
grficos, as como su anotacin (ttulos, leyenda, etiquetas, textos) y su impresin/exportacin
a otros formatos o aplicaciones. Incluye funciones tanto para la creacin de grficos 2D como
3D, visualizacin de imgenes, animaciones o grficos para presentaciones. Tambin incluye la
posibilidad de acceder a bajo nivel a dichos grficos con fin de personalizarlos o llegar a
desarrollar aplicaciones completas con interfaces grficas.
Robtica Industrial
Prctica 1
Introduccin a MATLAB
2012
Robtica Industrial
Prctica 1
Introduccin a MATLAB
2012
Disponemos de varias herramientas que nos permiten navegar por el directorio actual,
introducir comandos, ver las variables que se han ido creando o tener acceso al historial con
los comandos ejecutados.
Para terminar la sesin podemos elegir la opcin del men File > Exit MATLAB, o bien
podemos teclear el comando exit en la lnea de comandos.
2.1.1
Acceso a la documentacin
Para...
Buscar guas de inicio,
cdigo de ejemplos y
demos.
Intenta esto
En el panel Contents de la ventana de ayuda,
expande el rbol correspondiente al producto
de inters.
Robtica Industrial
Ms informacin
Para abrir la ventana de
ayuda:
Selecciona
Help
>
Product Help en el
men.
En la ventana de
comandos ejecuta el
comando doc.
Prctica 1
Introduccin a MATLAB
2012
3.3 Variables
MATLAB permite la creacin de variables y la asignacin a las mismas de un valor. A diferencia
de otros lenguajes de programacin, MATLAB no exige la declaracin de tipos para las
variables, sino que el tipo se determina dinmicamente en tiempo de ejecucin.
Un nombre de variable empieza siempre con una letra, seguida por un nmero de letras,
dgitos o underscores (_). Los nombres son sensibles a maysculas y minsculas, de modo
que A y a son dos variables distintas. Los sombres de las variables no pueden coincidir con los
nombres de palabras reservadas de MATLAB como if o end. El comando iskeyword devuelve
una lista completa de las palabras reservadas).
Se debe evitar crear variables con los mismos nombres que una funcin (como por ejemplo i, j,
mode, chark, size o path). Los nombres de las variables tienen precedencia sobre los nombres
de las funciones, por lo que al crear variables cuyo nombre coincida con el de una funcin,
pueden obtenerse resultados inesperados. Para saber si un nombre ya existe como nombre de
funcin, podemos usar la funcin exist. Para eliminar una variable de la memoria (workspace)
podemos usar la funcin clear.
Para asignar un valor a una variable se utiliza el operador =, con la sintaxis var_name =
expresin. Por ejemplo x=(5+3*7), que asignara a la variable x el valor 26.
Robtica Industrial
Prctica 1
Introduccin a MATLAB
2012
MATLAB usa los caracteres i y j para representar la unidad imaginaria, por ello debe evitarse el
uso de i y j como nombres de variables, en especial si va a usar aritmtica compleja.
4 Matrices y arrays
Como ya se indic al introducir MATLAB, ste surgi inicialmente para facilitar la realizacin de
clculos con matrices. Como aproximacin inicial podemos decir que en MATLAB todo son
matrices. Una matriz es cualquier array rectangular de nmeros (reales o complejos). En ese
sentido, un escalar se representa en MATLAB como una matriz de dimensin 1x1, y un vector
es una matriz que tiene una nica fila (vector fila) o una nica columna (vector columna).
Por ejemplo:
A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]
Robtica Industrial
13
Prctica 1
Introduccin a MATLAB
2012
10
11
12
15
14
Resultado
Una matriz de las dimensiones indicadas con todos los elementos
inicializados a cero
ones
Una matriz de las dimensiones indicadas con todos los elementos
inicializados a uno
eye
La matriz unidad de las dimensiones indicadas
diag
Permite crear una matriz diagonal, en la que los elementos de la diagonal
son los valores del vector que se le pasa como parmetro.
rand
Una matriz de las dimensiones indicadas con elementos aleatorios tomados
de una distribucin uniforme.
randn
Una matriz de las dimensiones indicadas con elementos aleatorios tomados
de una distribucin normal de media 0 y desviacin tpica 1.
linspace
Devuelve un vector fila con un conjunt de valores equiespaciados. Es
necesario indicar el valor inicial, el final y el nmero total de elementos.
Algunos ejemplos son:
Z = zeros(2,4)
Z =
0
0
0
0
0
0
F = 5*ones(3,3)
F =
5
5
5
5
5
5
5
5
5
0
0
N = fix(10*rand(1,10))
N =
9
2
6
4
R = randn(4,4)
R =
0.6353
0.0860
-0.6014
-2.0046
0.5512
-0.4931
-1.0998
0.4620
Robtica Industrial
-0.3210
1.2366
-0.6313
-2.3252
-1.2316
1.0556
-0.1132
0.3792
Prctica 1
Introduccin a MATLAB
2012
si slo queremos cargar parte de las variables, basta con indiquemos los nombres de las
mismas tras el nombre del fichero.
Tambin podemos usar load para cargar matrices desde un fichero de texto que contenga
datos numricos. El fichero debe estar organizado como una tabla de nmeros, separados por
espacios (o tabuladores), con una fila de la matriz en cada fila del fichero, y un mismo nmero
de elementos en cada una de las filas. Por ejemplo supongamos que tenemos un fichero de
texto denominado datos.dat cuyo contenido es:
16
2 13
5.0 10.0 11
9.0
6.0
8.0
7 12.0
1.5
Con el comando:
load datos.dat
10
Prctica 1
Introduccin a MATLAB
2012
R3 x 3 | P3 x1
T |
01x 3 | 1
Supongamos que:
R=[1 0 0; 0 0 -1; 0 1 0];
P=[1; 2; 3];
En cualquiera de los dos casos, lo que hay que tener en cuenta es que las dimensiones de los
bloques que formemos deben ser compatibles. En el primer caso, R y P son matrices de tres
filas y zeros(1,3) y 1 tienen una fila cada una. Adems la suma del nmero de columnas de los
elementos que forman cada fila de T es la misma (4 columnas en total). En el segundo caso
estamos en una situacin similar. Todos los elementos de la primera columna de la matriz T (R
y zeros(1,3)) tienen 3 columnas, mientras que para la segunda columna de T hemos usado
matrices de 1 columna. Respecto al nmero de filas, en ambos casos, cada columna de T tiene
un total de 4 filas.
13
11
10
Robtica Industrial
11
Prctica 1
Introduccin a MATLAB
2012
12
14
15
el elemento A(7) vale 7 (en la posicin 3,2), y el elemento A(9) es el 3 (en la posicin 1,3).
Si intentamos acceder a un elemento fuera de la matriz, obtendremos un error:
>> t=A(4,5)
??? Attempted to access A(4,5); index out of bounds because
size(A)=[4,4].
La funcin size nos sirve para calcular el tamao de una matriz. En su uso ms comn size(A),
nos devuelve un vector fila con el nmero de filas y columnas de la matriz:
>> size(A)
ans =
4
4
Podemos usar la funcin size para obtener slo el nmero de filas o el nmero de columnas.
Para ello (consultar la ayuda: doc size), es necesario aadir un segundo parmetro como puede
observarse en el siguiente ejemplo:
>> B=[A A];
>> size(B,1)
ans =
4
>> size(B,2)
ans =
8
Tambin disponemos de la funcin length, que devuelve el mximo entre el nmero de filas y
de columnas de una matriz. Es muy til en el caso de manejar vectores.
4.2.2 El operador dos puntos (:)
El operador dos puntos, : , es uno de los ms importantes en MATLAB y tiene varios usos. La
expresin:
>> 1:5
Robtica Industrial
12
Prctica 1
Introduccin a MATLAB
2012
Los valores a la izquierda y derecha del operador pueden ser cualquier expresin que devuelva
un escalar. Si queremos obtener un espaciado entre elementos no unitario, utilizaremos la
sintaxis:
>> 10:-3:1
ans =
10
7
0.7854
1.5708
2.3562
3.1416
Este operador podemos usarlo para referirnos a rangos de filas o columnas en una matriz. Por
ejemplo, para referirnos a los elementos de las filas 1 a 3 de la cuarta columna de la matriz A,
escribiramos:
A(1:3, 4)
Si queremos acceder a toda una fila (o una columna), podemos utilizar ste operador sin
necesidad de indicar un valor inicial y otro final. As, para referirnos a la fila 3 de la matriz B,
escribiramos:
B(3,:)
Podemos usar la palabra reservada end para referirnos a la ltima fila o columna de una
matriz. Por ejemplo para referirnos a los elementos a partir de la columna 2 de la penltima
fila de la matriz B, podemos escribir:
B(end-1,2:end)
Un ltimo caso que merece la pena destacar es el uso del operador : para convertir una matriz
en un vector columna. Para ello slo es necesario referirse a todos los elementos de la matriz
utilizando un nico ndice. Por ejemplo:
>> A(:)
ans =
16
5
9
4
2
11
7
14
Robtica Industrial
13
Prctica 1
Introduccin a MATLAB
2012
3
10
6
15
13
8
12
1
Ntese que como el resultado no tiene porqu ajustarse a una determinada estructura
rectangular, el resultado es devuelto como un vector columna.
4.2.4 Modificacin de elementos
Para modificar los elementos de una matriz o un array es suficiente con acceder a dichos
elementos y asignarles el nuevo valor. Por ejemplo:
A(1:4,3)=[0; 1; 2; 3]
Robtica Industrial
14
Prctica 1
Introduccin a MATLAB
2012
>> B=rand(4,5)
B =
0.7449
0.2251
0.8923
0.3500
0.2426
0.2871
0.1296
0.9275
>> B(:,3)=[]
B =
0.7449
0.2251
0.8923
0.3500
0.2426
0.2871
0.1296
0.9275
>> v=rand(1,8)
v =
0.2296
0.9361
0.0058
0.6103
>> v(v>0.5)=[]
v =
0.2296
0.4380
0.0513
0.5927
0.1629
0.8384
0.1676
0.5022
0.9993
0.3554
0.1676
0.5022
0.9993
0.3554
0.0471
0.2137
0.3978
0.3337
0.6832
0.9621
0.0471
0.2137
0.3978
0.3337
0.4380
0.9403
0.0058
5
11
10
8
9
7
6
12
4
14
15
1
-i 5+5i]'
- 1.0000i
+ 1.0000i
- 5.0000i
Robtica Industrial
15
Prctica 1
Introduccin a MATLAB
2012
5.0000 + 5.0000i
El problema surge al querer calcular las tres ltimas columnas. Aunque ya se ha explicado que
el operador ^ permite calcular potencias, si escribimos n^2 obtendremos un error
>> n^2
??? Error using ==> mpower
Robtica Industrial
16
Prctica 1
Introduccin a MATLAB
2012
Esto se debe a que MATLAB intenta calcular el product n*n, lo que no es posible si la matriz no
es cuadrada. Adems, aunque n fuese una matriz cuadrada, el resultado no sera el deseado. El
propio mensaje de error nos da una idea de como solucionar el problema al sugerirnos el uso
del operador (.^). Este operador lo que hace es aplicar la operacin ^ a cada elemento
individual del array. Este si es el resultado deseado. La solucin a nuestro problema es:
tabla=[ n n.^2 n.^(1/2)
tabla =
0
0
1.0000
1.0000
2.0000
4.0000
3.0000
9.0000
4.0000
16.0000
5.0000
25.0000
2.^n]
0
1.0000
1.4142
1.7321
2.0000
2.2361
1.0000
2.0000
4.0000
8.0000
16.0000
32.0000
Esta opcin de preceder el operador con un punto est disponible para todas aquellas
operaciones en las que las reglas propias del algebra lineal difieren del mero hecho de aplicar
la operacin a los elementos equivalentes de dos arrays de datos. As, la suma y la resta son
iguales que la suma y resta de matrices, pero para los dems casos disponemos de los
operadores:
.*
./
.\
.^
y
n.*n
Robtica Industrial
17
Prctica 1
Introduccin a MATLAB
0
0.5236
1.0472
1.5708
2.0944
2.6180
3.1416
0
0.5000
0.8660
1.0000
0.8660
0.5000
0.0000
2012
0
30.0000
60.0000
90.0000
120.0000
150.0000
180.0000
Funcin
Resultado
abs
Valor absoluto de valores reales y mdulo de valores complejos
acos
Arcocoseno
angle
Argumento de un nmero complejo
asin
Arcoseno
atan
Arcotangente
atan2
Arcotangente en 4 cuadrantes
ceil
Redondeo hacia infinito
conj
Conjugado de un nmero complejo
cos
Coseno
exp
Exponencial
fix
Redondea hacia cero
floor
Redondea hacia menos infinito
log
Logaritmo neperiano
log2
Logaritmo en base 2
log10
Logaritmo en mase 10
mod
Modulo (resto con signo tras la divisin entera)
rem
Resto de la divisin
round
Redondea al entero ms cercano
sign
Signo
sin
Seno
sqrt
Raz cuadrada
tan
Tangente
Para un listado complete de las funciones disponibles usar doc elfun o help elfun
4.4.2 Funciones bsicas para el anlisis de datos
MATLAB incluye un conjunto bsico de funciones para el anlisis de datos. Para el uso de estas
funciones es fundamental recordar que MATLAB est orientado, por defecto, al procesamiento
por columnas. Algunas de las funciones incluidas en este bloque son:
Funcin
cumprod
cumsum
cumtrapz
inpolygon
max
mean
Resultado
Devuelve un vector de la misma dimensin que el original, en el que cada
elemento es el producto acumulado de los anteriores. En el caso de arrays, el
clculo se hace para cada columna.
Devuelve un vector de la misma dimensin que el original, en el que cada
elemento es la suma acumulada de los elementos anteriores. En el caso de
arrays, el clculo se hace para cada columna.
Integracin numrica acumulativa (desde el primer elemento hasta el actual)
mediante el mtodo de los trapecios.
Detecta si un punto est dentro de una regin poligonal.
Vector fila con los mximos de cada columna de un array. Puede devolver
tambin la posicin en la que se encuentran dichos mximos.
Vector fila con el valor medio de cada columna de un array.
Robtica Industrial
18
Prctica 1
Introduccin a MATLAB
median
min
prod
sort
sortrows
std
sum
trapz
var
2012
5 Polinomios
MATLAB permite trabajar con polinomios y para ello usa el convenio de representar los
polinomios mediante vectores fila que contienen los coeficientes del polinomio ordenados por
orden decreciente del exponente. Por ejemplo, el polinomio
se
representa en MATLAB como el vector:
P=[1 0 -2 -5]:
Obsrvese que es necesario incluir el valor cero en la segunda posicin para indicar que no
existe el trmino de segundo grado.
Podemos sumar y restar polinomios usando los operadores + y sin ms que tener en cuenta
que los polinomios que intervengan deben ser del mismo grado (representados con vectores
de la misma longitud). Para ello rellenaremos con ceros por la izquierda para poder completar
el orden del polinomio de menor grado. Por ejemplo si queremos sumar el polinomio
al polinomio anterior, deberemos hacer:
q=[0 5 3 0];
MATLAB tambin nos ofrece un conjunto de funciones para operar con polinomios, las ms
bsicas son:
Funcin
conv
deconv
poly
polyder
polyfit
polyint
polyval
roots
Resultado
La operacin de convolucin de dos polinomios equivale a su
multiplicacin.
La deconvolucin de dos polinomios equivale a su divisin
Devuelve el polinomio con la raices indicadas.
Calcula la derivada de un polinomio
Ajusta un conjunto de datos a un polinomio del grado especificado.
Calcula el polinomio resultante de calcular la integral analtica.
Evala el polinomio en un conjunto de valores de la variable independiente
Calcula las races de un polinomio
Robtica Industrial
19
Prctica 1
Introduccin a MATLAB
2012
despus calcularemos el seno en cada una de esas posiciones angulares. No es necesario hacer
un bucle para recorrer cada elemento del array, ya que las propias funciones de MATLAB nos
permiten hacer el clculo en una nica instruccin:
seno=sin(angulo);
Podemos aadir un ttulo a la grfica o etiquetar los ejes mediante las funciones title, xlabel e
ylabel:
xlabel('ngulo = 0:2pi')
ylabel('Seno(angulo)')
title('Grfica de la funcin seno','FontSize',12)
Podemos superponer varias curvas en una misma figura utilizando el comando hold:
Hold on
Hace que sucesivas llamadas a plot se superpongan sin borrar las
curvas anteriores.
Hold off
(por defecto) Cada llamada a plot sustituye la curva anterior con la
nueva.
Hold
Conmuta el estado entre on y off.
Robtica Industrial
20
Prctica 1
Introduccin a MATLAB
2012
0.8
0.6
0.4
Seno(angulo)
0.2
-0.2
-0.4
-0.6
-0.8
-1
3
4
ngulo = 0:2pi
6.2.2 Subplot
El comando subplot nos permite mostrar varios grficos independientes en una misma
ventana. Para ello, la funcin recibe tres parmetros:
Robtica Industrial
21
Prctica 1
Introduccin a MATLAB
2012
subplot(m,n,p)
Con este comando dividimos la ventana grfica en una retcula de m filas y n columnas, para
dejar activada la celda p. Las celdas se numeran por filas, empezando por la fila superior y
siguiendo de izquierda a derecha. Por ejemplo, para representar las curvas anteriores en tres
grficos distintos:
figure(2)
subplot(1,3,1); plot(angulo,seno); title('figura 1');
xlabel('angulo'); ylabel('seno')
subplot(1,3,2); plot(angulo,seno,'+r'); title('figura 2');
xlabel('angulo'); ylabel('seno')
subplot(1,3,3); plot(angulo,seno,'g--'); title('figura 3');
xlabel('angulo'); ylabel('seno')
figura 2
figura 3
1
0.8
0.8
0.8
0.6
0.6
0.6
0.4
0.4
0.4
0.2
0.2
0.2
seno
seno
seno
figura 1
1
-0.2
-0.2
-0.2
-0.4
-0.4
-0.4
-0.6
-0.6
-0.6
-0.8
-0.8
-0.8
-1
5
angulo
10
-1
5
angulo
10
-1
5
angulo
10
En el caso de grficos tridimensionales es necesario especificar los valores para los tres ejes:
Robtica Industrial
22
Prctica 1
Introduccin a MATLAB
2012
El comando axis tambin nos permite modificar la relacin de aspecto de los ejes. Para ver el
efecto, veamos el aspecto que tendra una circunferencia unidad con las diferentes opciones
disponibles:
figure(3)
subplot(1,3,1);
plot(exp(i*(0:pi/20:2*pi)));
axis normal;
title('axis normal')
subplot(1,3,2);
plot(exp(i*(0:pi/20:2*pi)));
axis square;
title('axis square')
subplot(1,3,3);
plot(exp(i*(0:pi/20:2*pi)));
axis equal;
title('axis equal')
axis normal
axis equal
1
2.5
0.8
2
0.6
1.5
axis square
0.4
1
0.2
0.5
0.5
-0.2
-0.5
-0.5
-1
-1
-0.4
-1
-1.5
-0.6
-2
-0.8
-2.5
-1
-1
-1
Robtica Industrial
23
Prctica 1
Introduccin a MATLAB
2012
V (t )
dP(t )
2 cos(2t ) 2 sin(2t ) 1
dt
Para representar la posicin de la partcula entre t=0s y t=7s, podemos emplear el siguiente
cdigo:
t=0:0.1:7;
x=sin(2*t); y=cos(2*t); z=t;
plot3(x,y,z,'k','LineWidth',2);
grid on;
xlabel('\bfX'); ylabel('\bfY'); zlabel('\bfZ');
7
6
3
2
0
1
0
1.5
1
0.5
1.5
0.5
0.5
1
0
0
-0.5
Y
0.5
-0.5
-1
-0.5
-0.5
-1
-1
-1
-1.5
-1.5
X
Posicin de la particula
Posicin y velocidad de la partcula
Si queremos visualizar el vector velocidad en los puntos de la trayectoria, podemos usar el
comando quiver3
vx=2*cos(2*t); vy=-2*sin(2*t); vz=ones(size(t));
quiver3(x,y,z,vx,vy,vz,'b')
Robtica Industrial
24
Prctica 1
Introduccin a MATLAB
2012
Es posible cambiar el punto de vista desde el que se representa la figura con el comando view,
pasndole como parmetros la rotacin horizontal y la elevacin vertical en grados. Por
ejemplo:
View([-15 42])
0
1.5
1
0.5
0
-0.5
-1
Y
-1.5
-1.5
-1
-0.5
0.5
1.5
7 Un pequeo ejemplo
Supongamos que tenemos en un fichero una matriz con cuatro columnas que representan el
tiempo y las tres componentes de la velocidad instantnea de un objeto. Las mediciones han
sido realizadas con un periodo de muestreo de 10Hz:
0.0000000e+000
1.0000000e-001
.
.
.
6.9000000e+000
7.0000000e+000
2.0000000e+000
1.9601332e+000
.
.
.
6.6162976e-001
2.7347444e-001
-0.0000000e+000
-3.9733866e-001
.
.
.
-1.8873913e+000
-1.9812147e+000
1.0000000e+000
1.0000000e+000
.
.
.
1.0000000e+000
1.0000000e+000
Robtica Industrial
25
Prctica 1
Introduccin a MATLAB
2012
datos de velocidad
2
vx
vy
1.5
vz
velocidad (ms-1)
0.5
-0.5
-1
-1.5
-2
tiempo (s)
p=cumtrapz(t,v);
plot(t,p)
title('datos de posicin');
xlabel('tiempo (s)');
ylabel('posicin (m)');
datos de posicin
7
posicin (m)
-1
-2
4
tiempo (s)
Podemos visualizar los datos en 3D y, al igual que antes, visualizar la posicin del objeto cada
segundo:
plot3(p(:,1),p(:,2),p(:,3),'k','LineWidth',2)
grid on
xlabel('p(:,1)');
ylabel('p(:,2)');
zlabel('p(:,3)');
title('Trayectoria del objeto en el espacio');
Robtica Industrial
26
Prctica 1
Introduccin a MATLAB
2012
view([-15 42])
hold on
plot3(p(1:10:end,1),p(1:10:end,2),p(1:10:end,3),'o','MarkerFaceColor',
'g');
Trayectoria del objeto en el espacio
7
6
5
p(:,3)
4
3
2
1
0
0
-0.5
-1
-1.5
p(:,2)
-2
-0.8
-1
-0.4
-0.6
-0.2
0.2
0.4
0.6
0.8
p(:,1)
aceleracin (ms -2
-1
-2
-3
-4
tiempo (s)
Robtica Industrial
27
Prctica 1
Introduccin a MATLAB
2012
Los datos analizados coindicen con los del ejemplo analtico anterior, as que podemos saber
cul sera la aceleracin real del objeto, derivando la expresin analtica de la velocidad
respecto del tiempo. El resultado es:
A(t )
dV (t )
4 cos(2t ) 4 cos(2t ) 0
dt
8 Programacin
8.1 Control de flujo
Gran parte de la potencia de MATLAB reside en la facilidad para trabajar con datos
organizados en forma de arrays (tanto en algebra como en aplicaciones de anlisis de datos) y
en el amplio conjunto de funciones de que dispone. Estas facilidades hacen que con una nica
instruccin podamos resolver problemas que con un lenguaje tradicional como C, requieren la
generacin de un gran nmero de lneas de cdigo con bucles, bifurcaciones, etc.
Sin embargo, no todo puede resolverse siempre con una lnea de cdigo. Por ello, MATLAB
incluye las instrucciones de control de flujo necesarias para poder implementar cualquier
algoritmo.
8.1.1 Control de flujo condicional: if, else, y switch
Este tipo de instrucciones permite seleccionar, en tiempo de ejecucin, qu bloque de cdigo
se va a ejecutar realmente. La instruccin ms sencilla es if, que permite ejecutar un bloque de
cdigo si una determinada expresin se evala como cierta.
SINTAXIS
if expresin
instrucciones
end
Tambin se admite la construccin elseif como una forma de encadenar sucesivas condiciones.
Hay que tener en cuenta que el caso de elseif slo es necesario incluir una vez la palabra
reservada end para finalizar la instruccin. En el caso de utilizar else if debemos tener en
Robtica Industrial
28
Prctica 1
Introduccin a MATLAB
2012
cuenta que este nuevo if se interpreta como una instruccin separada y, por tanto, deber
llevar asociado un end al final.
SINTAXIS con elseif
if expresin
instrucciones
elseif
instrucciones
else
instrucciones
if expresin
instrucciones
else
if
instrucciones
else
instrucciones
end
end
end
Las expresiones utilizadas con la instruccin if pueden ser expresiones matriciales y conviene
tener en cuenta cmo son interpretadas. La forma normal de comparar la igualdad entre dos
variables es A==B, con lo que podemos escribir
if A==B,
Resultado
Cierto si el parmetro es una matriz vaca ([])
Cierto si todos los elementos del vector son ciertos. En caso de arrays hace el
clculo para cada columna.
any
Cierto si al menos un elemento del vector es cierto. En caso de array hace el
clculo para cada columna.
En ocasiones lo que queremos hacer es ejecutar diferente cdigo en funcin de una variable
que puede tomar una serie de valores conocidos. En este caso resulta ms apropiado utilizar la
instruccin switch.
SINTAXIS
switch expresin_del_switch
case expresin_caso_1
instrucciones
case expresin_caso_2
instrucciones
case expresin_caso_n
instrucciones
otherwise
instrucciones
end
Robtica Industrial
29
Prctica 1
Introduccin a MATLAB
2012
Cada posible opcin de los valores de la expresin del switch es un caso diferente. Al ejecutar
la instruccin switch, se compara el resultado de la expresin del switch con el resultado de la
expresin de cada caso hasta encontrar una comparacin que devuelva cierto. Un case es
cierto cuando:
Tipo de dato
Nmeros
Cadenas
Cell array
Condicin
isequal(expresin_caso. expresin_del_switch)
strcmp(expresin_caso. expresin_del_switch)
la expression del switch es un miembre de cell array que forma la
expresin del caso
Existen algunas diferencias con el lenguaje C que es importante destacar:
Robtica Industrial
30
Prctica 1
Introduccin a MATLAB
2012
k =
k =
1
1
2
3
k =
2
k =
3
En el caso de la izquierda, k toma como valor cada uno de los tres elementos que forman el
vector fila (1:3) y por tanto se ejecuta 3 veces. En el caso de la derecha, el mecanismo se
repite, k toma como valor cada una de las columnas de la matriz y ejecuta las instrucciones del
bucle. En este caso, cada columna tiene tres filas, por lo que en cada iteracin k es un vector
columna con tres elementos. Como la matriz que indica los posibles valores slo tiene 1
columna el bloque slo se ejecuta 1 vez.
La insturccin while ejecuta las instrucciones del bucle un nmero indefinido de veces. La
finalizacin del bucle depende de que la expresin que acompaa a while se evalue como
cierta. Al igual que el caso anterior, el conjunto de instrucciones que se ejecutan en el bucle va
delimitado con la palabra reservada end.
SINTAXIS
while expresin
Robtica Industrial
31
Prctica 1
Introduccin a MATLAB
2012
instrucciones
end
Como ejemplo, el siguiente cdigo permite buscar la raz de un polinomio por el mtodo de la
biseccin:
a = 0; fa = -Inf;
b = 3; fb = Inf;
while b-a > eps*b
x = (a+b)/2;
fx = x^3-2*x-5;
if sign(fx) == sign(fa)
a = x; fa = fx;
else
b = x; fb = fx;
end
end
Conviene tener en cuenta las mismas consideraciones hechas para la instruccin if en el caso
de que la expresin que controla la ejecucin del bucle while incluya matrices.
A diferencia de otros lenguajes de programacin, MATLAB no incluye la instruccin do while
o repeat until. Sin embargo esto no supone ningn problema dado que cualquiera de estos
bucles puede escribirse en funcin del bucle while como:
instrucciones
while expresin
instrucciones
end
En ocasiones puede ser necesario modificar la forma en la que se ejecutan las instrucciones
dentro de un bucle. Para ello disponemos de las instrucciones: continue y break.
La instruccin continue pasa inmediatamente a la siguiente iteracin del bucle dentro del que
aparece, evitando as la ejecucin de las instrucciones que aparezcan por debajo de ella en el
bucle. Por ejemplo, el siguiente cdigo evita la visualizacin del valor de k cuando k es par y
menor o igual que cuatro, aunque el bucle se ha ejecutado 6 veces.
for k=1:6
disp(sprintf('iteracion %d\n',k))
if ~rem(k,2) & k<=4
continue
end
k
end
iteracion 1
k =
1
iteracion 2
iteracion 3
k =
3
Robtica Industrial
32
Prctica 1
Introduccin a MATLAB
2012
iteracion 4
iteracion 5
k =
5
iteracion 6
k =
6
En este caso, la ejecucin del bucle se interrumpe totalmente al encontrar el primer valor que
cumple la condicin de la instruccin if. Usando la instruccin break podemos mejorar la
eficiencia del algoritmo de la biseccin mostrado anteriormente:
a = 0; fa = -Inf;
b = 3; fb = Inf;
while b-a > eps*b
x = (a+b)/2;
fx = x^3-2*x-5;
if fx == 0
break
elseif sign(fx) == sign(fa)
a = x; fa = fx;
else
b = x; fb = fx;
end
end
x
Robtica Industrial
33
Prctica 1
Introduccin a MATLAB
2012
[71x3
[71x3
[71x3
[71x1
double]
double]
double]
double]
Para acceder a los campos que forma una estructura, escribiremos el nombre de la variable
seguido de un punto (.), y a continuacin se escribe el nombre del campo. Cada campo puede
ser de un tipo distinto. Tambin es posible aadir campos dinmicamente. Por ejemplo para
aadir a la estructura anterior un campo con una cadena para poder identificar el tipo de
visualizacin que queremos, podramos hacer:
particula.visualizacion='3D';
Los campos de una estructura puede ser tambin estructuras. Por ejemplo:
particula.experimento.fecha='30-01-2012';
particula.experimento.equipo='simulador 1';
particula
particula =
posicion:
velocidad:
aceleracion:
tiempo:
visualizacion:
experimento:
[71x3 double]
[71x3 double]
[71x3 double]
[71x1 double]
'3D'
[1x1 struct]
particula.experimento
ans =
Robtica Industrial
34
Prctica 1
Introduccin a MATLAB
2012
fecha: '30-01-2012'
equipo: 'simulador 1'
[71x3 double]
[71x3 double]
[71x3 double]
[71x1 double]
'3D'
[1x1 struct]
ans =
posicion:
velocidad:
aceleracion:
tiempo:
visualizacion:
experimento:
[71x3 double]
[71x3 double]
[71x3 double]
[71x1 double]
[]
[1x1 struct]
Podemos comprobar que los campos que no hemos asignado en partcula 2 estn inicializados
a la matriz vaca.
Hay varias formas de unir los valores de un mismo campo de diferentes elementos de un array
de estructuras. Por ejemplo si hacemos
particula.posicion
nos devuelve una lista separada por comas de elementos. Es lo mismo que escribir:
paticula(1).posicion, particula(2).posicion
Si encerramos dicha lista entre corchetes, la convertimos en un array en el que cada elemento
de la lista sera una columna del nuevo array:
Robtica Industrial
35
Prctica 1
Introduccin a MATLAB
2012
[particula.posicion]
ans =
0
0.1987
0.3894
0.5646
0.7174
...
...
0.7404
0.8592
0.9437
0.9906
1.0000
0.9801
0.9211
0.8253
0.6967
...
...
0.6722
0.5117
0.3308
0.1367
0
0.1000
0.2000
0.3000
0.4000
...
...
6.7000
6.8000
6.9000
7.0000
0
-0.1987
-0.3894
-0.5646
-0.7174
...
...
-0.7404
-0.8592
-0.9437
-0.9906
-1.0000
-0.9801
-0.9211
-0.8253
-0.6967
...
...
-0.6722
-0.5117
-0.3308
-0.1367
0
-0.1000
-0.2000
-0.3000
-0.4000
...
...
-6.7000
-6.8000
-6.9000
-7.0000
El resultado es una matriz de seis columnas formadas por las tres columna de la posicin de la
partcula 1 y las tres columnas de la posicin de la partcula 2. Para poder hacer esto, en
nmero de filas de las matrices de posicin tiene que ser el mismo.
Podemos asignar cada elemento de la lista a una variable diferente. Para ello podemos hacer:
[p1 p2]=particula.posicion
111
108
97
Robtica Industrial
36
Prctica 1
Introduccin a MATLAB
2012
Podemos hacer la concatenacin en vertical si todas las cadenas tienen la misma longitud. Si
las cadenas tienen distinta longitud podemos usar el comando char:
S = char('Un','ejemplo','con','cadenas de','diferente','tamao')
whos S
Name
S
Size
6x10
Bytes
120
Class
char
Attributes
0.6324
0.0975
0.2785
0.5469
0.9575
0.9649
0.1576
0.9706
0.9572
0.4854
0.8003
0.1419
C =
[4x4 double]
[1x4 double]
[30.7593]
'un ejemplo'
Los dos primeros no se muestran porque ocuparan mucho espacio. Debemos recordar dos
puntos importantes:
Para recuperar el contenido de un elemento del cell array, usaremos las mismas reglas
que para un array normal, pero encerrando los ndices entre llaves.
Si al crear un cell array utilizamos variables, en el elemento correspondiente queda
almacenada una copia del valor de la variable.
Por ejemplo, podemos emplear un cell array para almacenar una secuencia de matrices.
Tambin podemos usarlos para agregar informacin de un campo de un array de estructuras
cuando no podemos asegurar que los datos almacenados en dicho campo tienen las
dimensiones adecuadas. Usando el ejemplo de la seccin anterior, podramos hacer:
{particula.posicion}
Robtica Industrial
37
Prctica 1
Introduccin a MATLAB
2012
'tamao'
El programa es largo,
Incluye bucles, condicionales u otras sentencias de control de flujo,
Queremos desarrollar trozos de cdigo que pueden ejecutase sobre datos de entrada
diferentes (funciones)
Para estos casos, podemos escribir el programa o la funcin en un fichero de texto al que
podremos llamar como a cualquier otra funcin de MATLAB. MATLAB permite desarrollar dos
tipos de programas:
Al comenzar a trabajar con MATLAB conviene crear los nuevos programas en el directorio
actual. A medida que vayamos cogiendo experiencia, podemos probar a organizar nuestros
programas en directorios, creando nuestras propias toolboxes y hacindolas accesibles como
cualquier otra funcin sin ms que aadirlas al camino de bsqueda (search path) de MATLAB.
Si duplicamos el nombre de una funcin se ejecutar la primera que se encuentre siguiendo el
orden definido en el path.
8.3.1 Scripts
Un script es una conjunto de instrucciones almacenadas en un fichero de texto cuya extensin
es .m. Los scripts tienen acceso al workspace, de manera que pueden acceder a variables ya
creadas o crear nuevas variables que permanecern en el workspace una vez finalizada la
ejecucin del script.
8.3.2 Funciones
Las funciones son programas que pueden aceptar uno o varios argumentos de entrada, y
devolver un o varios resultados. El nombre de la funcin debe ser el mismo que el del fichero
de texto en el que est almacenada, y la extensin del fichero debe ser tambin .m. Las
Robtica Industrial
38
Prctica 1
Introduccin a MATLAB
2012
funciones tienen su propio mbito para las variables, de modo que no es posible acceder
directamente a las variables del workspace y todas las variables creadas durante la ejecucin
de la funcin desaparecen al finalizar la ejecucin de la misma.
La funcin rank.m nos puede servir para ver la estructura bsica de una funcin:
function r = rank(A,tol)
%
RANK Matrix rank.
%
RANK(A) provides an estimate of the number of linearly
%
independent rows or columns of a matrix A.
%
RANK(A,tol) is the number of singular values of A
%
that are larger than tol.
%
RANK(A) uses the default tol = max(size(A)) * norm(A) * eps.
s = svd(A);
if nargin==1
tol = max(size(A)') * max(s) * eps;
end
r = sum(s > tol);
La primera lnea del fichero que contiene la funcin comienza con la palabra reservada
function. Esta lnea sirve para definir el nombre de la funcin y el orden de los argumentos de
entrada y de salida. En este ejemplo hay un argumento de salida (r) y dos argumentos de
entrada (A y tol).
Las siguientes lneas que empiezan por el carcter % son comentarios. Estos comentarios no
sirven slo como documentacin interna de la funcin, sino que son la ayuda que
obtendremos al ejecutar el comando help rank.
El resto del fichero contiene el cdigo necesario para calcular el valor de r en funcin de los
parmetros de entrada A y tol. Todas estas variables, as como la variable s son locales a la
funcin y no aparecern el workspace. La funcin puede usarse de diferentes formas:
39
Prctica 1
Introduccin a MATLAB
2012
En este caso, definimos la funcin stat que calcula la media y la desviacin tpica de los datos
contenidos en el vector x:
Es destacable que no es necesario utilizar ningn bucle para la realizacin de los clculos.
Tambin es interesante analizar cul sera el resultado si x es un array. Un primer comentario
tiene que ver con la forma de calcular el valor de n. Tal y como est calculado, la funcin
retornar el valor correcto tanto si x es un vector fila como si es un vector columna ya que en
cualquier caso, tendremos un vector 1xn o nx1. El nico problema que podramos tener es si el
array tiene menos filas que columnas. En ese caso, se podra recurrir al uso de la funcin size.
Una posible solucin sera:
[m, n]=size(x);
if n==1 % tenemos un vector columna
n=m;
end
Dado que sum opera sobre cada columna, no habra problema para calcular el valor de las
medias. El problema surge al calcular error dado que mean sera un vector fila con tantas
columnas como x por lo que no podemos hacer el clculo de x mean. Podemos comparar dos
posibles soluciones. La primera sera la aplicacin directa de las tcnicas de programacin en
lenguajes como C, es decir, hacer un bucle que recorra cada fila de x y restarle a cada fila el
valor de la media:
if any(size(x)==1)
% se trata de un vector, usamos el cdigo original
stdev = sqrt(sum((x-mean).^2/n));
else
% se trata de un array
error=zeros(1,n);
for k=1:m
error=error+(x(k,:)-mean).^2;
end
stdev = sqrt(error/n);
end
La otra opcin es convertir a mean en una matriz del mismo tamao que x y de forma que
mean se repita en cada fila. Para lograrlo podemos multiplicar un vector columna con tantas
Robtica Industrial
40
Prctica 1
Introduccin a MATLAB
2012
filas como x e inicializado a 1 por la el vector fila mean. La otra forma de hacerlo es utilizar la
funcin repmat y crear una matriz que sea la concatenacin de copias de mean en un array de
m filas y una columna. Una vez que mean es del mismo tamao que x, podemos usar el mismo
cdigo para calcular stdev:
if all(size(x)>1)
mean=ones(m,1)*mean; % o repmat(mean,m,1);
end
stdev = sqrt(sum((x-mean).^2/n));
x = [];
for k = 2:1000
x = [x rand(3,1)+k];
end
Este tipo de solucin es adecuada cuando no sabemos el tamao final que va a tener la matriz
final pero tienen el problema de que la ejecucin se hace ms lenta. Por ello, si conocemos el
tamao de la variable, es mejor reservarlo de antemano.
x = zeros(1,1000);
for k = 2:1000
x(k) = x(k-1) + 5;
end
Robtica Industrial
x = zeros(1,1000);
for k = 2:1000
x(:,k) = rand(3,1)+k;
end
41
Prctica 1