You are on page 1of 42

2012

Introduccin a MATLAB

Ingeniera de Sistemas y Automtica


Universidad de Oviedo
25/01/2012

Introduccin a MATLAB

2012

0 Contenido
0

Contenido .............................................................................................................................. 1

Qu es MATLAB? ................................................................................................................. 2

1.1

Componentes de MATLAB ............................................................................................ 3

1.2

Documentacin y ayuda ................................................................................................ 4

Primeros pasos con MATLAB................................................................................................. 5


2.1

Iniciando y finalizando MATLAB .................................................................................... 5

2.1.1
3

MATLAB como calculadora cientfica .................................................................................... 7


3.1

Operaciones bsicas y precedencia de operadores ...................................................... 7

3.2

Operaciones lgicas....................................................................................................... 7

3.3

Variables ........................................................................................................................ 7

3.4

Aritmtica compleja ...................................................................................................... 8

3.5

Supresin de eco en pantalla ........................................................................................ 8

Matrices y arrays ................................................................................................................... 8


4.1

Introducir matrices ........................................................................................................ 8

4.1.1

Creacin directa de matrices................................................................................. 8

4.1.2

Creacin de matrices a partir de funciones .......................................................... 9

4.1.3

Cargar matrices desde un fichero de datos ........................................................ 10

4.1.4

Concatenacin ..................................................................................................... 10

4.2

Acceso a los elementos de una matriz ........................................................................ 11

4.2.1

Acceso bsico ...................................................................................................... 11

4.2.2

El operador dos puntos (:) ................................................................................... 12

4.2.3

Indexacin mediante vectores de booleanos ..................................................... 14

4.2.4

Modificacin de elementos ................................................................................. 14

4.3

Operaciones con matrices ........................................................................................... 15

4.3.1

Traspuesta ........................................................................................................... 15

4.3.2

Operaciones aritmticas ..................................................................................... 16

4.3.3

Divisin (multiplicacin por la inversa) ............................................................... 16

4.3.4

Funciones ............................................................................................................ 16

4.4

Acceso a la documentacin ................................................................................... 6

Operaciones con arrays ............................................................................................... 16

4.4.1

Uso de funciones con arrays ............................................................................... 17

4.4.2

Funciones bsicas para el anlisis de datos ........................................................ 18

Polinomios ........................................................................................................................... 19

Robtica Industrial

Prctica 1

Introduccin a MATLAB
6

2012

Funciones grficas bsicas .................................................................................................. 20


6.1

Creacin de una figura con plot .................................................................................. 20

6.2

Creacin de varios grficos en una misma ventana .................................................... 21

6.2.1

Ventanas grficas ................................................................................................ 21

6.2.2

Subplot ................................................................................................................ 21

6.2.3

Control de los ejes ............................................................................................... 22

6.2.4

Introduccin a los grficos 3D ............................................................................. 24

Un pequeo ejemplo........................................................................................................... 25

Programacin ...................................................................................................................... 28
8.1

Control de flujo............................................................................................................ 28

8.1.1

Control de flujo condicional: if, else, y switch..................................................... 28

8.1.2

Bucles: for, while, continue y break .................................................................... 31

8.2

Otros tipos de datos .................................................................................................... 34

8.2.1

Estructuras .......................................................................................................... 34

8.2.2

Cadenas y texto ................................................................................................... 36

8.2.3

Cell arrays ............................................................................................................ 37

8.2.4

Arrays multidimensionales .................................................................................. 38

8.3

Funciones y scripts ...................................................................................................... 38

8.3.1

Scripts .................................................................................................................. 38

8.3.2

Funciones ............................................................................................................ 38

8.4

Reservar espacio para los arrays ................................................................................. 41

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

MATLAB implementa algoritmos plenamente probados, lo que nos permite estar


seguros de los resultados que proporcionan sus funciones.
Permite hacer clculos complejos con muy pocos comandos.
Permite desarrollar nuestras propias funciones para aplicaciones particulares.
Tiene una gran capacidad grfica en 2 y 3D, con una gran capacidad de interaccin con
los grficos. Adems stos pueden ser fcilmente exportados a otros programas.
Es muy til para el trabajo con grandes conjuntos de datos, ya que permite trabajar
con ellos de forma paralela en base a su representacin en forma de matrices.
Desarrollo de aplicaciones con interfaces grficas de usuario.
El entorno integrado permite el desarrollo y depuracin de nuestras propias funciones
sin necesidad de recurrir a herramientas externas.

Algunos campos de aplicacin de MATLAB en ingeniera son: procesamiento digital de seal,


procesamiento de imagen, diseo de sistemas de control, modelado de sistemas, desarrollo de
aplicaciones de test y medida, prototipado de sistemas en tiempo real. Para ello se basa en las
denominadas Toolboxes, que consisten en colecciones de funciones de propsito especial
orientadas a la solucin de problemas especficos en ingeniera. Estas Toolboxes pueden ser
comerciales, gratuitas o desarrolladas por el propio usuario. En este curso, emplearemos la
toolbox de robtica creada por el profesor Peter Corke para el anlisis y la solucin de
problemas en el campo de la robtica industrial.
MATLAB tambin proporciona herramientas para documentar y compartir el trabajo, como
por ejemplo generar una pgina web con los resultados de nuestros clculos. Tambin permite
la integracin del cdigo desarrollado en MATLAB con otros lenguajes (C, C++, Fortran),
aplicaciones (EXCEL, Bases de Datos, ) o hardware (Tarjetas de Adquisicin, puerto serie,
cmaras, ).

1.1 Componentes de MATLAB


MATLAB est integrado por los siguientes elementos fundamentales:

Herramientas de escritorio y Entorno de desarrollo : Estn formadas por el


Escritorio y la ventana de comandos, un editor y depurador integrados, un analizador de
cdigo, y herramientas para visualizar la ayuda, el espacio de trabajo, las carpetas o el historial
de comandos.

Librera de funciones matemticas : Es una amplia coleccin de algoritmos


computacionales que cubren desde funciones elementales como la suma, seno, coseno y la
aritmtica de complejos, a funciones matemticas de alto nivel como el clculo de la inversa
de una matriz, clculo de valores propios o transformadas de Fourier.

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:

programar lo pequeo para desarrollar rpidamente funciones y programas que no


estn pensados para ser reutilizados.

Robtica Industrial

Prctica 1

Introduccin a MATLAB

2012

programar lo grande para desarrollar aplicaciones completas o nuevas toolboxes,


que pueden alcanzar alto nivel de complejidad, y que estn pensadas para ser
reutilizadas.

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.

Interfaces externas : Permiten la interaccin entre MATLAB y programas desarrollados en


otros lenguajes, o para la exportacin / importacin de datos.

1.2 Documentacin y ayuda


Una ventaja importante de MATLAB es su amplia documentacin, accesible desde el propio
entorno. La documentacin est disponible en formato HTML y PDF. El punto de inicio para un
nuevo usuario es la gua Getting Started, que cubre de forma sencilla las caractersticas
fundamentales de MATLAB, con muchos ejemplos que pueden ser copiados y ejecutados
fcilmente en la ventana de comandos. La documentacin de MATLAB est organizada en los
siguientes puntos:

Desktop Tools and Development Environment : Ayuda sobre la forma de

uso de las diferentes herramientas que constituyen el entorno


Data Import and Export : Entrada y salida de datos con MATLAB.
Mathematics : Librera de funciones matemticas disponibles

Data Analysis : Herramientas disponibles para el anlisis de datos, como por

ejemplo: ajuste de datos, anlisis de Fourier o herramientas para el anlisis de series


temporales.
Programming Fundamentals : Cubre el lenguaje de programacin de MATLAB y
los fundamentos sobre cmo desarrollar aplicaciones con MATLAB.
Object-Oriented Programming : Documentacin sobre las caractersticas
orientadas a objeto de MATLAB.
Graphics : Informacin sobre las herramientas para la creacin de grficos
proporcionadas por MATLAB
3-D Visualization : Herramientas para la visualizacin de datos 3D.
Creating Graphical User Interfaces : Herramientas para la creacin de
interfases grficas de usuario (GUI).
External Interfaces : Documentacin sobre las interfases externas de MATLAB
(MEX-files, MATLAB engine, Java, Microsoft .NET Framework, COM, servicios Web y el
puerto serie)

Incluye tambin la documentacin de referencia para todas las funciones de MATLAB:

Function Reference : Lista todas las funciones de MATLAB por categoras o


alfabticamente.

Robtica Industrial

Prctica 1

Introduccin a MATLAB

2012

Handle Graphics Property Browser : Documentacin sobre las propiedades


de los objetos grficos.

C/C++ and Fortran API Reference : Documentacin sobre las funciones


usadas por las interfaces externas de MATLAB.

La documentacin de MATLAB tambin incluye un relacin indexada de los ejemplos incluidos


en la documentacin para poder acceder directamente a los mismos, unas notas sobre la
versin y enlaces a la documentacin imprimible en PDF (descargable desde la pgina web de
Mathworks).
Los dems productos que se integran en MATLAB (Simulink, Toolboxes, etc) tienen una
estructura similar para su documentacin, encontrndose accesible dicha informacin una vez
que se instalan dichas herramientas.

2 Primeros pasos con MATLAB


2.1 Iniciando y finalizando MATLAB
En sistemas Windows podemos arrancar MATLAB haciendo un doble click sobre el icono de la
aplicacin que aparece en el escritorio, o bien seleccionando MATLAB en el men de inicio. Al
arrancarlo nos aparecer la ventana principal del entorno de MATLAB:

Figura 1 El entorno de MATLAB

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.

Buscar informacin sobre


un tema.

En el campo de bsqueda de la ventana de


ayuda, teclea los terminos sobre los que deseas
buscar ayuda. Despus presiona Enter.
En la lnea de comandos, ejecuta doc
nombre_funcin para abrir la pgina deseada
en la ventana de ayuda.
Para ver la ayuda en lnea dentro de la ventana
de commandos, ejecuta el comando help
nombre_funcin. En ocasiones, el texto
muestra los nombres de las funciones todo en
maysculas para facilitar que se distinga de
otros textos. Cuando se llame a la funcin no se
debe usar el nombre todo en maysculas.
Seleccionar Help > Function Browser en el
menu y luego buscar el nombre de la funcin de
inters.
En el editor, se usan colores y otras pistas para
determinar si la sintaxis es correcta.

Ver la ayuda sobre una


funcin o un bloque.

Buscar una funcin


visualizar su ayuda.

Obtener pistas sobre la


sintaxis y los parmetros
de funciones mientras se
usa la ventana de
comandos o el editor.

Obtener ayuda especfica


mientras se usa una
herramienta.
Verificar el cdigo y
obtener recomendaciones
sobre cmo mejorarlo.

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.

Pginas de ayuda de los


commandos:
doc
help

Mientras se introduce una funcin, hacer una


pausa despus de teclear el parntesis
izquierdo y antes de empezar a introducir los
parmetros. Un resumen de las opciones de
sintaxis aparece en una ventana temporal.
Para autocompletar el nombre de una funcin o
variable, pulsar la tecla tabulador tras introducir
una parte del nombre, en una ventana
temporal se muestras las funciones y variables
que comienzan por el texto tecleado.
Algunas herramientas ofrecen ayuda sensible al
contexto. Accede a la ayuda usando los botones
de ayuda o los mens contextuales.

Ver la ayuda especfica


de cada herramienta
para saber si incluye
ayudas contextuales.

En el editor, ver los mensajes de la herramienta


M-Lint

Prctica 1

Introduccin a MATLAB

2012

3 MATLAB como calculadora cientfica


3.1 Operaciones bsicas y precedencia de operadores
MATLAB puede usarse como una potente calculadora cientfica en la que los las expresiones a
evaluar se introducen por teclado. Los operadores aritmticos bsicos son +, -, *, / y ^
(operador elevado a), que pueden usarse junto con los parntesis para alterar la precedencia
de los mismos. El orden de precedencia es:
1.
2.
3.
4.

Cantidades entre parntesis: (2+3)*5 5 * 5 25


Potencias (^): 2 + 3^2 2 + 9 11
*, /, que se ejecutan de izquierda a derecha: 2 * 6 / 4 12 / 4 3
+, -, que se ejecutan de izquierda a derecha: 2 + 3 7 5 7 -2

3.2 Operaciones lgicas


MATLAB tambin permite incluir operaciones lgicas. Sigue el criterio habitual de interpretar 0
como falso y distinto de cero como cierto. Los operadores lgicos y de comparacin son: ==
(comparacin igual), ~= (distinto), < (menor), > (mayor), <= (menor o igual), >= (mayor o igual),
~ (negacin), & (y lgico), | (o lgico), && (short circuit AND), || (short circuit OR).
Las operaciones && y || se diferencian de & y de | en que la parte a la derecha del operador
slo se evala si el valor de la parte izquierda no es suficiente para determinar el resultado de
la operacin.
Las operaciones lgicas y de comparacin tienen el menor nivel de precedencia. Por ejemplo:
2+3<45<40

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.

3.4 Aritmtica compleja


MATLAB permite operar directamente con valores complejos. Como se indic en el apartado
anterior, i y j se utilizar para representar la unidad imaginaria (i=j=sqrt(-1)). Si queremos
obtener la parte real o la parte imaginaria de una cantidad compleja, podemos usar las
funciones real y imag respectivamente. Las funciones abs y angle permiten calcular el mdulo
y la fase de un valor complejo.

3.5 Supresin de eco en pantalla


MATLAB muestra en pantalla el resultado de la expresin introducida desde la lnea de
comandos. Si queremos evitar dicho eco por pantalla, basta con terminar las expresiones con
el carcter punto y coma (;).

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).

4.1 Introducir matrices


Podemos introducir matrices de varias formas:
1.
2.
3.
4.

Introducir una lista explcita de elementos.


Crear matrices a partir de funciones.
Cargar matrices a partir de ficheros externos de datos.
Mediante concatenacin de otras matrices.

4.1.1 Creacin directa de matrices


Para crear una matriz directamente en MATLAB debemos seguir las siguientes reglas:
1.
2.
3.
4.

Separar los elementos de una fila mediante espacios en blanco o comas.


Utilizar el carcter punto y coma (;) para indicar el final de cada fila.
Encerrar toda la lista de elementos entre corchetes.
La matriz vaca (sin elementos) se representa con [], es decir sin introducir ningn
elemento entre los corchetes.

Por ejemplo:
A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]

a lo que MATLAB responder con el resultado:


A =
16

Robtica Industrial

13

Prctica 1

Introduccin a MATLAB

2012

10

11

12

15

14

En el espacio de trabajo (workspace) veremos la variable A. Podremos referirnos a esta matriz


utilizando el nombre de la variable en la que la hemos almacenado.
4.1.2 Creacin de matrices a partir de funciones
MATLAB proporciona una serie de funciones que nos permiten crear tipos especiales de
matrices. Las funciones ms bsicas son:
Funcin
zeros

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

4.1.3 Cargar matrices desde un fichero de datos


La forma ms simple de importar datos desde un fichero es utilizando la funcin load. Esta
funcin permite cargar varias variables diferentes, cada una con el mismo nombre con el que
se salv, si se utilizan ficheros con el formato .mat. Como ejemplo, y suponiendo que hemos
creado las matrices de los ejemplos anteriores, podemos salvar dichas matrices en un fichero
con el comando save:
save mis_datos A Z F N

Con este comando salvamos en el fichero mis_datos.mat las variables A, Z, F y N. Si slo


ponemos el nombre del fichero y no indicamos ningn nombre de variable, salvaramos todas
las variables existentes en el workspace.
Para cargar al workspace el contenido de un fichero .mat, basta con hacer:
load mis_datos

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

4.0 15.0 14.0

1.5

Con el comando:
load datos.dat

leeramos el contenido del fichero y quedara almacenado en la variable datos. Un fichero de


texto slo puede contener una matriz. Tambin podemos usar el comando save para guardar
una matriz en un fichero de texto. Para ms informacin sobre todas las posibilidades que
ofrecen los comandos load y sabe, consultar la ayuda de MATLAB.
4.1.4 Concatenacin
Es un proceso por el que podemos crear matrices a partir de la unin de otras matrices ms
pequeas. Una forma de ver esta idea es volver a lo ya enunciado de que para MATLAB
prcticamente todo es una matriz. En ese sentido, la introduccin directa de una matriz
consistira en la concatenacin de un conjunto de matrices 1x1. Esta idea podemos ampliarla a
matrices de otros tamaos. Por ejemplo consideremos el caso de construir una matriz de
transformacin homognea, que es un tipo de matriz empleada en la representacin de
Robtica Industrial

10

Prctica 1

Introduccin a MATLAB

2012

transformaciones entre distintos sistemas de coordenadas. La estructura de este tipo de


matrices es:

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];

Entonces, construyendo T por filas:


T=[ R P; zeros(1,3) 1];

o bien, si lo hacemos por columnas:


T=[ [R; zeros(1,3)] [P; 1] ];

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.

4.2 Acceso a los elementos de una matriz


4.2.1 Acceso bsico
Para acceder al elemento en la fila r y la columna c de la matriz A, se usa la notacin A(r,c). En
el caso de trabajar con vectores fila (matrices 1xn) o vectores columna (matrices mx1) es
suficiente con emplear un nico ndice. As, para acceder al elemento k del vector V
escribiremos V(k). A diferencia de otros lenguajes como C, los ndices siempre comienzan con
el valor 1.
Tambin podemos usar un nico ndice para referirnos a un elemento de una matriz
rectangular cualquiera. Para interpretar el resultado, es necesario tener en cuenta que
MATLAB almacena los valores de las matrices por columnas. Es decir, el primer elemento de la
matriz A ser el A(1,1), el segundo el A(2,1) y as sucesivamente. Como ejemplo, si tenemos la
matriz:
A =
16

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].

Podemos usar matrices para acceder simultneamente a ms de un elemento de una matriz.


Por ejemplo, si que queremos acceder a los elementos 1 y 3 de la fila 4 de la matriz A,
haremos:
>> A(4,[1 3])
ans =
4
15

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

Produce como resultado un vector fila con los enteros entre 1 y 5:


ans =
1

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

Otro ejemplo puede ser:


>> 0:pi/4:pi
ans =
0

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

4.2.3 Indexacin mediante vectores de booleanos


Podemos usar vectores de valores booleanos para acceder a los elementos de una matriz. La
mejor forma de ilustrar este caso es mediante un ejemplo. Supongamos que queremos
obtener los valores de la matriz A que son mayores que cinco. Para ello basta con indicar la
condicin como ndices de la matriz:
>> A(A>5)
ans =
16
9
11
7
14
10
6
15
13
8
12

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]

Lo importante es que las expresiones a la izquierda y a la derecha de la asignacin tengan las


mismas dimensiones.
Existen dos casos particulares:

Si se va a asignar a todos los elementos el mismo valor, es suficiente con indicar el


numero valor como un escalar
Si se desea eliminar filas o columnas de un array, o elementos de un vector, se les
asignar la matriz vaca. Por ejemplo:

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

4.3 Operaciones con matrices


Dado que MATLAB naci orientado a facilitar la solucin de problemas de clculo matricial, no
es de extraar que soporte de forma nativa las operaciones fundamentales del algebra lineal.
4.3.1 Traspuesta
El operador apstrofo () permite calcular la conjugada de la traspuesta de una matriz. En el
caso de trabajar con matrices reales, el clculo de la conjugada es irrelevante ya que la parte
imaginaria de un nmero real es siempre cero.
>> A'
ans =
16
2
3
13

5
11
10
8

9
7
6
12

4
14
15
1

En el caso de una matriz de nmeros complejos tendramos:


>> [1 3+i
ans =
1.0000
3.0000
0
5.0000

-i 5+5i]'

- 1.0000i
+ 1.0000i
- 5.0000i

Si queremos asegurarnos de que slo se realiza la trasposicin podemos usar el operardor


precedido de un punto, como por ejemplo:
>> [1 3+i -i 5+5i].'
ans =
1.0000
3.0000 + 1.0000i
0 - 1.0000i

Robtica Industrial

15

Prctica 1

Introduccin a MATLAB

2012

5.0000 + 5.0000i

4.3.2 Operaciones aritmticas


Podemos usar los operadores +, - y *
para realizar las operaciones aritmticas
correspondientes (suma, resta y multiplicacin de matrices). En este tipo de operaciones
debemos tener en cuenta las reglas habituales aplicables sobre las dimensiones de las
matrices.
4.3.3 Divisin (multiplicacin por la inversa)
Aunque la divisin de matrices no est definida, MATLAB utiliza los operadores / y \ para
abreviar la forma de representar el producto por la inversa de una matriz. La razn por la que
existen los dos operadores es que el producto de matrices no es una operacin conmutativa,
por lo que el resultado de multiplicar B-1*A es distinto del de multiplicar A*B-1.
En concreto, cuando queramos hacer la operacin A*B-1 escribiremos A/B, mientras que en el
otro caso, escribiremos A\B.
4.3.4 Funciones
MATLAB ofrece un amplio conjunto de funciones para hacer clculos con matrices. Entre otras
podemos destacar:
Funcin
Calcula
inv
Calcula la inversa de una matriz, si existe.
det
Calcula el determinante de una matriz
norm
Calcula la norma de un vector o una matriz
eig
Calcula los autovalores de una matriz
Para un listado completo de las funciones disponibles usar doc matfun o help matfun.

4.4 Operaciones con arrays


Aunque frecuentemente se intercambia el uso de los trminos matriz y array, en este caso nos
referiremos a operaciones a realizar con datos que estn almacenados en una estructura de
tipo array. En estos casos, lo que nos interesa es realizar una misma operacin sobre cada
elemento de un array o entre elementos equivalentes de diferentes arrays.
Supongamos que queremos generar una tabla con los valores de los cuadrados, la raz
cuadrada y las potencias de dos de los nmeros naturales de 0 a 10. Los datos deben quedar
almacenados en las diferentes columnas de la tabla. El primer paso sera crear un vector
columna con los nmeros enteros entre 0 y 5:
n=(0:5);

el siguiente paso sera crear la tabla aplicando el mtodo de concatenacin:


tabla=[n n_al_cuadrado raiz_de_n dos_a_n];

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

Inputs must be a scalar and a square matrix.


To compute elementwise POWER, use POWER (.^) instead.

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:

.*
./
.\
.^

Multiplicacin elemento a elemento.


Divisin elemento a elemento.
Divisin elemento a elemento por la izquierda.
Elevar a un valor cada elemento.

As por ejemplo, las expresiones:


n.^2

y
n.*n

produciran el mismo resultado.


4.4.1 Uso de funciones con arrays
En el apartado 4.3.4 se ha mencionado que MATLAB proporciona funciones que permiten
resolver clculos de algebra linear con matrices. Sin embargo, al trabajar con arrays de datos
suele ser habitual que tengamos que aplicar algn tipo de funcin (seno, coseno, logaritmo,
raz cuadrada, etc.) a cada elemento del array. MATLAB resuelve este problema de una manera
muy sencilla. Cuando a una de estas funciones aritmticas le pasamos como parmetro un
array, MATLAB aplica la funcin a cada elemento del array lo que evita tener que crear bucles
para realizar el clculo. En cierto modo, lo que hacemos es paralelizar el clculo sobre todo el
conjunto de valores. Por ejemplo:
[(0:pi/6:pi)' sin(0:pi/6:pi)' (0:pi/6:pi)'*180/pi]
ans =

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

Vector fila con las medianas de cada columna de un array.


Vector fila con los mnimos de cada columna de un array. Puede devolver
tambin la posicin en la que se encuentran dichos mnimos.
Vector fila con el producto de los elementos de cada columna del array. En el
caso de vectores es el producto de todos los elementos.
Ordena los elementos en orden ascendente
Ordena las filas de un array en orden ascendente.
Vector fila con la desviacin tpica de cada columna de un array
Vector fila con la suma de los elementos de cada columna del array. En el caso
de vectores es la suma de todos los elementos.
Vector fila con la integral numrica, por el mtodo de los trapecios, de los
elementos de cada columna del array.
Vector fila con la varianza de cada columna de un array

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

6 Funciones grficas bsicas


6.1 Creacin de una figura con plot
La funcin plot puede usarse de diferentes maneras en funcin de los parmetros que se le
pasen (ver doc plot). Si y es un vector, plot(y) produce una aproximacin lineal a trozos de la
curva representada por los elementos de y frente al ndice. Si se especifican dos vectores de
las mismas dimensiones, plot(x,y), se representan los valores de y frente a los de x. Por
ejemplo sin queremos hacer una representacin del valor del seno en funcin del ngulo en el
rango [0, 2], lo primero que haremos es seleccionar un conjunto discreto de valores angulares
en dicho rango:
angulo=0:pi/100:2*pi;

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);

Por ltimo dibujaremos la curva:


plot(angulo,seno)

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.

Tambin es posible cambiar la forma en la que se representa la curva. Como ejemplo,


podemos aadir a la curva anterior los puntos reales que la componen y la aproximacin
resultante si hubisemos elegido una resolucin 25 veces menor:
hold on
plot(angulo,seno,'rx',angulo(1:25:end),seno(1:25:end),'--g')

Robtica Industrial

20

Prctica 1

Introduccin a MATLAB

2012

Grfica de la funcin seno


1

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 Creacin de varios grficos en una misma ventana


6.2.1 Ventanas grficas
Las funciones grficas crean automtica una ventana para la figura si no hay ninguna
disponible. Si ya existe, se utiliza para enviar a ella la salida del comando grfico. Como se
coment en el apartado anterior, hold permite controlar si los nuevos grficos sustituyen o se
aaden a los ya existentes. Podemos crear nuevas ventanas grficas mediante la funcin
figure. Dicha funcin devuelve un handle de ventana que puede ser utilizado para seleccionar
dicha ventana antes de ejecutar la siguiente instruccin grfica sin ms que volver a llamar a la
funcin y pasarle como parmetro el handle de la ventana que queremos activar. Si no existe
una ventana con el handle indicado, se crea una ventana nueva con dicho handle.
Podemos utilizar las opciones que aparecen en los mens y las barras de botones para:

Editar la grfica: colores, tipos de lnea, ejes, etc.


Hacer zoom: puede ser de una zona o slo en uno de los ejes en funcin de lo
seleccionado con los mens contextuales.
Podemos rotar la figura.
Ver el valor de cada punto y desplazarnos por los puntos que constituyen la grfica.
Aadir una leyenda.

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

6.2.3 Control de los ejes


El comando axis nos permite modificar el rango, la orientacin y el aspecto de los ejes de la
figura.
Por defecto, MATLAB busca el mnimo y el mximo de los datos a representar y elige
automticamente un rango que cubra dichos valores. Usando el comando axis podemos
especificar dichos rangos de forma manual:
axis([xmin xmax ymin ymax])

En el caso de grficos tridimensionales es necesario especificar los valores para los tres ejes:

Robtica Industrial

22

Prctica 1

Introduccin a MATLAB

2012

axis([xmin xmax ymin ymax zmin zmax])

Podemos volver a los lmites automticos usando el comando:


axis auto

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

El comando grid nos permite controlar la visualizacin del grid de la figura:

grid on, activa la visualizacin del grid


grid off, desactiva la visualizacin (por defecto)

Robtica Industrial

23

Prctica 1

Introduccin a MATLAB

2012

grid, conmuta el estado de la visualizacin entre on y off.

6.2.4 Introduccin a los grficos 3D


MATLAB dispone de funciones que nos permiten dibujar curvas 3D o visualizar superficies. La
funcin bsica para visualizar una curva en el espacio 3D es la funcin plot3, cuyo
funcionamiento es muy similar a plot, salvo que necesita los tres vectores correspondientes a
las coordenadas x, y, z de los puntos que constituyen la curva.
Supongamos que una partcula se mueve siguiendo una trayectoria helicoidad definida por:

P(t ) sin(2t ) cos(2t ) t ,


La velocidad con que se desplaza es la derivada de la posicin respecto del tiempo, luego:

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');

Si queremos representar la posicin de la particula tras cada segundo de movimiento:


hold on
plot3(x(1:10:end),y(1:10:end),z(1:10:end),'o',
'MarkerFaceColor',[0 1 0])

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

El objetivo es calcular la trayectoria seguida por el objeto.


Podemos cargar el fichero en un array y visualizar los datos
datos=load('velocidad.dat');
t=datos(:,1);
v=datos(:,2:end);
plot(t,v,'.-')
xlabel('tiempo (s)')
ylabel('velocidad (ms^{-1})');
title('datos de velocidad');
legend('v_x','v_y','v_z')

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)

Tambin podemos analizar la aceleracin de la partcula. Para ello debemos aproximar


numricamente la derivada de la velocidad utilizando la funcin gradient:
acceleracin aproximada
4

aceleracin (ms -2

-1

-2

-3

-4

tiempo (s)

acc=[gradient(v(:,1),0.1) gradient(v(:,2),0.1) gradient(v(:,3),0.1)];


figure
plot(t,acc)
xlabel('tiempo (s)');
ylabel('aceleracin (ms^{-2}');
title('acceleracin aproximada');

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

La instruccin if puede combinarse con la instruccin else, de modo que si la expresin es


cierta, se ejecuta bloque de cdigo que sigue a if y si es falsa, se ejecuta el bloque de cdigo
que sigue a else.
SINTAXIS
if expresin
instrucciones
else
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

SINTAXIS con else if

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,

El cdigo es correcto y funcionar como esperamos en el caso de que A y B sean escalares


(matrices 1x1). Sin embargo, si A y B son matrices, el operador == comprueba qu elementos
de ambas matrices son iguales por lo que el resultado es una matriz del mismo tamao que A y
B con valores 0 y 1 que reflejan si los elementos son iguales o no. De hecho, si A y B tienen
distinta dimensin se producir un error en tiempo de ejecucin. Para resolver este caso
debemos utilizar la funcin isequal.
Otras funciones que nos pueden servir para resolver estos casos:
Funcin
isempty
all

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:

En MATLAB no se contina la comprobacin de casos, es decir, en MATLAB slo se


ejecuta el grupo de instrucciones pertenecientes al primer caso que se evale a cierto.
Por eso no es necesario aadir una instruccin break al final del caso para evitar que la
ejecucin contine.
No es necesario incluir el carcter :
Para identificar el caso que se ejecuta si todos los dems son falsos, se utiliza la
palabra reservada otherwhile.

Algunos ejemplos de uso son:


a) Mostrar un texto en funcin del valor introducido por el usuario:
mynumber = input('Enter a number:');
switch mynumber
case -1
disp('negative one');
case 0
disp('zero');
case 1
disp('positive one');
otherwise
disp('other value');
end

b) Decidir qu grfica representar en funcin del valor de una cadena:


x = [12, 64, 24];
plottype = 'pie3';
switch plottype
case 'bar'
bar(x)
title('Bar Graph')
case {'pie','pie3'}
pie3(x)
title('Pie Chart')
legend('First','Second','Third')
otherwise

Robtica Industrial

30

Prctica 1

Introduccin a MATLAB

2012

warning('Unexpected plot type. No plot created.');


end

8.1.2 Bucles: for, while, continue y break


MATLAB incluye dos formas para permitir la ejecucin repetida de un conjunto de
instrucciones. Una es la instruccin for. La principal caracterstica de la instruccin for es que el
nmero de veces que se repite el cdigo del bloque es conocido de antemano. Para delimitar
las instrucciones que forman el cdigo del bucle, emplearemos la palabra reservada end.
SINTAXIS
for index_var = valores
instrucciones
end
En cada iteracin, index_var toma un nuevo valor de los indicados en valores y se ejecuta el
conjunto de instrucciones que forman el bucle con el nuevo valor de index_var. El valor de
ixdex_var al finalizar el bucle es el ltimo valor del conjunto de posibles valores.
Valores es una matriz, de forma que index_var toma como valores las distintas columnas de
dicha matriz:
Valores es un vector fila
for k=1:3
k
end

Valores es un vector columna


for k=[1; 2; 3]
k
end

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

La instruccin break nos permite abandonar la ejecucin de un bucle, pasando a ejecutar la


siguiente instruccin posterior al bucle. El siguiente ejemplo sirve para visualizar la diferencia
de funcionamiento con la instruccin continue:
for k=1:6
disp(sprintf('iteracion %d\n',k))
if ~rem(k,2) & k<=4
break
end
k
end
iteracion 1
k =
1
iteracion 2

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

Funcionara igual si utilizamos continue en lugar de break?


Si queremos finalizar la ejecucin de un programa inmediatamente, podemos usar la
instruccin return.

Robtica Industrial

33

Prctica 1

Introduccin a MATLAB

2012

8.2 Otros tipos de datos


8.2.1 Estructuras
Las estructuras son tipos de datos que permiten almacenar diferente informacin en un mismo
dato. Las diferentes unidades de informacin se denominan campos y se identifican por un
nombre que debe seguir las mismas reglas que los nombres de las variables. Por ejemplo,
podemos agrupar los datos de tiempo, posicin, velocidad y aceleracin de la partcula del
ejemplo anterior una nica variable de tipo estructura que el ejemplo se llama partcula:
t=0:0.1:7;
p=[sin(2*t) cos(2*t) t];
t=(0:0.1:7)';
p=[sin(2*t) cos(2*t) t];
v=[2*cos(2*t) -2*sin(2*t) ones(size(t))];
a=[-4*sin(2*t) -4*cos(2*t) zeros(size(t))];
particula.posicion=p;
particula.velocidad=v;
particula.aceleracion=a;
particula.tiempo=t;
particula
particula =
posicion:
velocidad:
aceleracion:
tiempo:

[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'

Podemos formar arrays de estructuras. As, si tuvisemos un segundo conjunto de datos,


podemos hacer:
particula(2).posicion=-p;
particula(2).tiempo=t;
particula(2).aceleracion=-a;
particula(2).velocidad=-v;
particula(2).experimento.equipo='simulador 2'
particula(1)
particula(2)
particula =
1x2 struct array with fields:
posicion
velocidad
aceleracion
tiempo
visualizacion
experimento
ans =
posicion:
velocidad:
aceleracion:
tiempo:
visualizacion:
experimento:

[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

De esta manera, guardamos en p1 la posicin de la primera partcula y en p2 la posicin de la


segunda.
8.2.2 Cadenas y texto
Aunque ya hemos usado cadenas a lo largo de este documento, es hora de hacer algunos
comentarios sobre su uso en MATLAB. Para construir una cadena, simplemente encerraremos
el texto entre comillas simples:
S='Hola'
S es una array formado por cinco caracteres. Internamente, se almacena el valor numrico del
cdigo correspondiente al carcter. Si ejecutamos la instruccin:
double(S)

obtenemos como resultado


ans =
104

111

108

97

Para volver a transformar el resultado en una cadena, podemos hacer:


char([104 111 108 97])
ans =
hola

Podemos unir cadenas por el mecanismo de concatenacin de arrays. Por ejemplo:


h = [s, ' mundo']

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

8.2.3 Cell arrays


Un cell array es un array en el que sus elementos pueden ser tipos de datos diferentes. Para
distinguirlos de los arrays normales, se representan con llaves en lugar de con corchetes. Por
ejemplo:
A=rand(4)
C={A sum(A) prod(sum(A)) 'un ejemplo'}
A =
0.8147
0.9058
0.1270
0.9134

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}

o para tener una lista de cadenas de diferente longitud:


{'Un';'ejemplo';'con';'cadenas de';'diferente';'tamao'}
ans =
'Un'
'ejemplo'
'con'
'cadenas de'
'diferente'

Robtica Industrial

37

Prctica 1

Introduccin a MATLAB

2012

'tamao'

8.2.4 Arrays multidimensionales


Los arrays multidimensionales en MATLAB, son arrays con ms de dos ndices para acceder a
sus elementos. Pueden crearse con funciones como zeros, ones, rand o randn, simplemente
pasando como parmetros el valor correspondiente a cada dimensin. Tambin pueden
generarse asignado valores a los diferentes elementos.

8.3 Funciones y scripts


El lenguaje de MATLAB es interpretado, lo que nos permite introducir las distintas
instrucciones una a una en la lnea de comandos y ver el resultado. Este mtodo no es
apropiado cuando:

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:

SCRIPTS: No aceptan argumentos de entrada ni devuelven ningn resultado.


Interactan directamente con el workspace. A todos los efectos es equivalente a
introducir todas las lneas de programa una a una por la lnea de comandos.
FUNCIONES: que pueden aceptar argumentos de entrada y/o retornar uno o varios
resultados. No tienen acceso al workspace y las variables internas son locales a la
funcin, desapareciendo al final la ejecucin de la misma. En MATLAB todos los
parmetros se pasan por valor, es decir, pasamos una copia del valor del parmetro en
el momento de la llamada.

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:

rank(diag([1 2 3])) o rank(B)


rank(A)
rank(B,1e-6)

Muchas funciones de MATLAB operan de esta forma. Si el resultado no se almacena en otra


variable o se usa como parte de una expresin, quedar almacenado en la variable ans. Si no
se suministra un valor para el segundo argumento, la funcin lo identifica y le asigna un valor
por defecto. Para ello, dentro del cuerpo de la funcin podemos acceder a dos variables
denominadas nargin y nargout que nos indican el nmero de argumentos de entrada y de
salida que ha recibido la funcin en una llamada concreta. Por ejemplo, al ejecutar rank(diag([1
2 3])), nargin toma el valor 1. El cdigo de la funcin detecta este caso y le asigna un valor por
defecto a tol. En el ltimo ejemplo, nargin toma el valor 2 por lo que se usa dicho valor sin
necesidad de tener que asignarle un valor por defecto.
Una funcin puede devolver ms de un resultado. Para ello slo es necesario escribir la lista de
resultados separada por comas y encerrada entre corchetes. La siguiente funcin es un
ejemplo de este comportamiento:
Robtica Industrial

39

Prctica 1

Introduccin a MATLAB

2012

function [mean,stdev] = stat(x)


n = length(x);
mean = sum(x)/n;
stdev = sqrt(sum((x-mean).^2/n));

En este caso, definimos la funcin stat que calcula la media y la desviacin tpica de los datos
contenidos en el vector x:

Primero se calcula el nmero de elementos del vector y se almacena en n.


mean se calcula como la suma de los elementos del vector y se divide por el nmero
de elementos del mismo.
stdev se calcula como la raz cuadrada del error cuadrtico medio suma del cuadrado
de la diferencia entre el valor y la media, dividida por el nmero de elementos.
Obsrvese el uso del operador (.^) y que el hecho de dividir cada trmino por n no
afecta al resultado debido a las propiedades de la suma.

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));

Este tipo de solucin resulta mucho ms eficiente en MATLAB y el cdigo es ms fcil de


mantener al tener menos lneas.

8.4 Reservar espacio para los arrays


En MATLAB podemos hacer los arrays en tiempo de ejecucin. A continuacin mostramos dos
ejemplos distintos:
x = 0;
for k = 2:1000
x(k) = x(k-1) + 5;
end

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

You might also like