Programación MATLAB - Sample
Programación MATLAB - Sample
aplicaciones
Pedro Jorge De Los Santos
Este libro est a la venta en http://leanpub.com/programacionmatlab
Esta versin se public en 2016-08-04
This is a Leanpub book. Leanpub empowers authors and publishers with the Lean Publishing
process. Lean Publishing is the act of publishing an in-progress ebook using lightweight tools and
many iterations to get reader feedback, pivot until you have the right book and build traction once
you do.
NDICE GENERAL
ndice general
Fundamentos del lenguaje . . . . . . . . . . .
Qu es MATLAB? . . . . . . . . . . . . .
Descripcin del entorno de desarrollo . . .
Comandos bsicos y generalidades . . . . .
Tipos de datos y operadores . . . . . . . . .
Un mini tutorial de introduccin . . . . . .
Ficheros de comandos (scripts) . . . . . . .
Entradas y salidas en el Command Window
Funciones . . . . . . . . . . . . . . . . . . .
Bifurcaciones y bucles . . . . . . . . . . . .
Fecha y hora . . . . . . . . . . . . . . . . .
Problemas . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Versin incompleta
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
1
3
4
12
19
22
24
30
35
38
Versin incompleta
Qu es el prompt?
En la jerga informtica, se denomina prompt al smbolo o caracter que aparece en una
terminal o consola, cuando esta se encuentra en disposicin de aceptar un comando de
entrada.
Current Folder
Carpeta en la que se est situado, y en la que MATLAB buscar y guardar (por defecto) los archivos
generados durante la sesin.
Workspace
Ventana que muestra las variables creadas por el usuario durante la sesin, indicando el nombre,
valor y tipo de la misma.
Command History
Permite buscar comandos introducidos con anterioridad en la ventana de comandos y ejecutarlos
nuevamente o copiarlos.
Versin incompleta
Lneas de comentarios
Los comentarios de una sola lnea en MATLAB deben comenzar con el smbolo de porcentaje %,
todo aquello escrito despus de este smbolo ser ignorado por el intrprete y reconocido como
comentario, asignndosele un color verde caracterstico de forma automtica.
1
Para hacer bloques de comentarios MATLAB dispone de una sintaxis especfica que se muestra
enseguida:
Versin incompleta
1
2
3
4
5
%{
Esto es un comentario de mltiples
lneas en MATLAB, delimitado por
llaves conjuntas con el signo %
%}
Valores especiales
En la siguiente tabla se resumen algunos valores especiales devueltos por funciones predefinidas en
MATLAB:
Funcin
ans
eps
intmax
intmin
realmax
realmin
pi
inf
NaN
computer
version
Descripcin
Guarda el ultimo valor no asignado a una variable
Tolerancia numrica que MATLAB soporta en los clculos
Mximo valor entero que puede utilizarse
Mnimo valor entero que puede utilizarse
Valor de coma flotante mximo que puede representarse
Valor de coma flotante mnimo que puede representarse
Constante matemtica (3.14159265)
Valor asignado a un nmero demasiado grande respecto a la capacidad
de clculo del software.
Iniciales de Not a Number, tal cual traduccin literal hace referencia a
un valor numrico invlido.
Devuelve el tipo de computadora que se est utilizando
Devuelve la versin de MATLAB
Versin incompleta
Tipo logical
Las variables de tipo lgico permiten, evidentemente, dos valores, que pueden ser true o false (1 y 0
lgicos). Una forma de declarar una variable de tipo lgico sera:
1
2
3
>> a = true
a =
1
>> a=logical(1)
a =
1
Las lneas anteriores crean una variable a de tipo lgico con un valor true (1 lgico).
Tipo char
Son cadenas de caracteres, que pueden contener valores alfanumricos e incluso smbolos especiales.
Para declararlas no hace falta especificar que son variables tipo char, dado que MATLAB es de tipado
dinmico y reconoce como tal aquellas cuyo valor asignado se encuentre delimitado por comillas
simples, un ejemplo muy clsico es el siguiente:
1
2
3
Tipo numeric
Normalmente cuando en MATLAB tecleamos un valor numrico o bien lo asignamos a una
determinada variable, esta ser de tipo double, a menos que se haga una conversin explicita a
otro tipo de dato. Por ejemplo, si insertamos en MATLAB lo siguiente:
1
2
3
>> num = 10
num =
10
Y posteriormente tecleamos la instruccin whos para verificar el tipo o clase de dicha variable:
Versin incompleta
1
2
3
>> whos
Name
num
Size
1x1
Bytes
8
Class
double
Attributes
Si se requiere utilizar un dato de tipo entero habr de realizarse la conversin como sigue:
1
2
3
4
5
6
Bytes
1
Class
int8
Attributes
Tipo cell
Un cell array es un tipo de dato caracterstico del lenguaje MATLAB que consiste en un arreglo
multidimensional de celdas que pueden contener cualquier tipo de dato, inclusive otro cell array. Un
ejemplo muy sencillo de cell array se muestra enseguida:
1
2
3
[1x2 double]
Tipo struct
Las estructuras son arreglos de datos que, de forma similar a los cell arrays, pueden almacenar
variables de diversos tipos. Para la organizacin de los datos se utilizan campos que pueden contener
slo un tipo de dato. A continuacin se muestra un ejemplo de cmo crear una estructura:
1
2
3
4
5
6
7
8
9
10
>> Alumno.Nombre='Jorge';
>> Alumno.Apellido='De Los Santos';
>> Alumno.Cursos={'Programacin','Clculo','Mtodos Numricos'};
>> Alumno.Notas=[10 9 10];
>> Alumno
Alumno =
Nombre: 'Jorge'
Apellido: 'De Los Santos'
Cursos: {'Programacin' 'Clculo' 'Mtodos Numricos'}
Notas: [10 9 10]
Attributes
>> n=10;
>> val=false;
>> s='MATLAB';
>> C={1,2,3};
>> ST.Nombre='Anna';
>> whos
Name
Size
C
1x3
ST
1x1
n
1x1
s
1x6
val
1x1
Bytes
360
184
8
12
1
Class
cell
struct
double
char
logical
Attributes
Adems del comando whos, puede utilizarse la funcin class para determinar el tipo de dato de una
variable pasada como argumento, por ejemplo:
Versin incompleta
1
2
3
4
>> a=3;
>> class(a)
ans =
double
>> num=2;
>> class(num)
ans =
double
Las conversiones entre tipos numricos son de sintaxis muy sencilla, solo habr que especificar el
tipo de dato al cual se convertir, siendo permitidos los especificados en la tabla siguiente:
Tipo de dato
Precisin doble
Precisin simple
Entero de 8 bits
Entero de 16 bits
Entero de 32 bits
Entero de 64 bits
Entero sin signo de 8 bits
Entero sin signo de 16 bits
Entero sin signo de 32 bits
Entero sin signo de 64 bits
Sintaxis de conversin
double(num)
single(num)
int8(num)
int16(num)
int32(num)
int64(num)
uint8(num)
uint16(num)
uint32(num)
uint64(num)
Rango
2.2251e-308 a 1.7977e+308
1.1755e-38 a 3.4028e+38
-128 a 127
-32768 a 32767
231 a 231 1
263 a 263 1
0 a 255
0 a 65535
0 a 4294967295
0 a 18446744073709551615
As, podemos convertir la variable num, creada con anterioridad, a otro tipo de dato numrico, por
ejemplo a un entero de 8 bits:
Versin incompleta
1
2
3
4
>> num=int8(num);
>> class(num)
ans =
int8
Es necesario poner especial atencin en los rangos que pueden manipularse con cada tipo numrico,
debido a que por ejemplo si se realiza la siguiente conversin:
1
2
3
>> num=int8(653)
num =
127
El valor que ha sido pasado como argumento de conversin excede el rango para un entero de 8 bits,
por lo cual simplemente se le asigna el mximo valor permitido para una variable de este tipo.
Si requiere verificar por usted mismo los valores mximos y mnimos permitidos para cada tipo
de dato, puede usar las funciones realmin y realmax para los tipos de coma flotante, y las
correspondientes intmin e intmax para tipos enteros.
De string a tipo numrico
Para este tipo de conversiones MATLAB dispone de la funciones str2double y str2num, en algunos
casos no notar la diferencia en los resultados, salvo en la rapidez de ejecucin. Pese a lo anterior, es
necesario tomar en cuenta cmo trabaja cada funcin y cual le resulta de utilidad; con str2double
se convierte una variable tipo string en un valor de tipo double, la funcin str2num tambin realiza
conversin a tipo double pero adems realiza conversiones a otros tipos de datos numricos si se
especifica de manera explcita, de hecho esta tiene una funcionalidad muy similar a la de la funcin
eval. Los siguientes ejemplos muestran las diferencias y utilidades de las funciones descritas.
1
2
3
4
5
6
7
8
9
10
>> a=str2double('1237')
a =
1237
>> b=str2num('1237')
b =
1237
>> whos
Name
Size
a
1x1
b
1x1
Bytes
8
8
Class
double
double
Attributes
Versin incompleta
10
>> 1+2
ans =
3
En este caso 1 y 2 son los operandos o valores sobre los cuales se aplica el operador +, y 3 es,
evidentemente, el resultado de ejecutar la operacin.
En la siguiente tabla se listan los principales operadores aritmticos disponibles en MATLAB.
Operador
+
*
/
.
./
.*
Descripcin
Operador suma
Operador resta
Operador multiplicacin (escalares)
Operador divisin
Potenciacin
Potenciacin elemento a elemento
Divisin elemento a elemento (matrices)
Multiplicacin elemento a elemento (matrices)
Note que adems de los operadores correspondientes a las operaciones aritmticas bsicas (suma,
resta, multiplicacin, divisin, potenciacin), se tiene operadores que realizan operaciones elemento
a elemento, que se utilizan para operar sobre arreglos matriciales.
Por ejemplo, sean A y B dos matrices de 3x3 definidas como
(
)
1 2
A=
3 4
(
)
5 6
A=
7 8
Si realizamos una suma o resta con estas matrices no habr mayor complicacin, dado que tanto la
Versin incompleta
11
>> A=[1,2;3,4];
>> B=[5,6;7,8];
>> A+B
ans =
6
8
10
12
>> A-B
ans =
-4
-4
-4
-4
Luego, note las diferencias de utilizar la multiplicacin elemento a elemento (.*) y la ordinaria (*):
1
2
3
4
5
6
7
8
>> A*B
ans =
19
43
>> A.*B
ans =
5
21
22
50
12
32
S, efectivamente los resultados son completamente diferentes: en el primer caso se realiza una
multiplicacin matricial, siguiendo las reglas dictadas por el lgebra de matrices, en el segundo
caso lo que se hace es una multiplicacin elemento a elemento, es decir, cada elemento en la posicin
(i, j) de A se multiplica con el elemento ubicado en la misma posicin de B.
Operadores relacionales
Los operadores relacionales se utilizan para comparar dos valores, devolviendo un valor lgico.
Normalmente se utilizan en conjunto con las estructuras de control para la toma de decisiones sobre
el procedimiento o flujo de un programa.
La siguiente tabla resume los operadores relacionales: su notacin y descripcin.
https://es.wikipedia.org/wiki/Multiplicaci%C3%B3n_de_matrices
Versin incompleta
12
Operador
==
<
>
<=
>=
=
Descripcin
Igual a
Menor que
Mayor que
Menor o igual que
Mayor o igual que
Diferente de
Puede ver que la notacin difiere de la que ordinariamente utilizamos cuando escribimos en papel,
por ejemplo el smbolo del menor o igual que () se escribe como <=. Es importante notar que
la comparacin igual que se realiza con un doble signo igual (==), puesto que el uso de un nico
signo corresponde a la asignacin, a continuacin se muestra lo que ocurre cuando intentamos hacer
comparaciones utilizando slo un signo =:
1
2
3
4
5
6
7
8
>> 1==1
ans =
1
>> 1=1
1=1
|
Error: The expression to the left of the equals sign is not a valid target for a\
n assignment.
En el primer caso (doble signo) la comparacin se hace devolviendo un true, pero, en el segundo
nos manda un error de sintaxis, indicando que el 1 ubicado a la izquierda del signo igual no es un
caracter vlido para realizar una asignacin.
Operadores lgicos
Operador
&
|
Descripcin
Operador lgico and
Operador lgico or
Operador lgico not
13
del entorno MATLAB que nos permite interactuar de forma dinmica, si tecleamos una instruccin
automticamente nos devolver un resultado y se crearn variables en las cuales se almacenen los
diversos valores de salida. Por ejemplo, vamos a teclear una simple suma aritmtica:
1
2
3
>> 3+2
ans =
5
Puede verificar que en el workspace ahora aparece una variable llamada ans con valor de 5, en ans
se guarda por defecto el ltimo resultado no asignado a una variable, podramos asignar el resultado
de la suma a una variable especfica:
1
2
3
>> suma=3+2
suma =
5
Podemos tambin asignar valores a determinadas variables y enseguida utilizarlas para ejecutar
alguna operacin, por ejemplo:
1
2
3
4
5
6
7
8
9
10
11
>> a=5;
>> b=7;
>> a*b
ans =
35
>> a-b
ans =
-2
>> a/b
ans =
0.7143
Note que el colocar un punto y coma (;) al final de una instruccin evita que se muestre un resultado
de salida, lo cual no afecta en el almacenamiento de los valores correspondientes, pero podra resultar
de mucha ayuda al momento de seleccionar los valores que se quieren mostrar en la ventana de
comandos.
MATLAB tambin tiene disponible diversas funciones matemticas predefinidas, que pueden ser
aplicadas sobre un nmero o sobre una matriz o arreglo de nmeros. Algunas funciones trigonomtricas:
Versin incompleta
14
1
2
3
4
5
6
7
8
9
>> sin(pi/2)
ans =
1
>> cos(pi/4)
ans =
0.7071
>> tan(pi/3)
ans =
1.7321
Note que el valor de la constante est predefinida en MATLAB mediante la cadena pi:
1
2
3
>> pi
ans =
3.1416
MATLAB devuelve un valor de 3.1416, lo cual es un valor redondeado de , pero esto es cuestin
solamente de la representacin, normalmente se utiliza el formato short (4 dgitos despus del punto
decimal) para la representacin de valores numricos, internamente MATLAB utiliza ms digitos
para manejar y operar con el valor de . Si queremos obtener ms digitos en la salida por consola
podemos cambiar el formato de salida:
1
2
3
4
El formato largo permite representar una cantidad con 16 decimales. Incluso es posible forzar a que
se muestre una representacin en forma racional:
1
2
3
4
5
6
7
8
9
10
Se puede crear una lista o arreglo de valores numricos encerrando estos entre corchetes, y separando
cada elemento por comas o espacios.
Versin incompleta
15
1
2
3
4
5
6
>> A=[5,8,10,2,7]
A =
5
8
10
>> B=[3 7 1 0 -2]
B =
3
7
1
-2
Se puede obtener el valor mximo y mnimo de un arreglo numrico utilizando las funciones max y
min respectivamente.
1
2
3
4
5
6
>> max(A)
ans =
10
>> min(A)
ans =
2
>> mean(A)
ans =
6.4000
>> length(A)
ans =
5
>> numel(A)
ans =
5
Incluso podemos representar grficamente cada uno de los elementos de un vector mediante la
funcin plot:
1
2
>> x=[1,2,1,3,4,2,0,1];
>> plot(x);
Versin incompleta
16
Utilizando plot
De manera similar puede evaluar una funcin matemtica en un intervalo determinado y trazar su
grfica:
1
2
3
>> x=0:0.01:10;
>> y=sin(x);
>> plot(x,y)
En lo anterior, se crea un vector x en el intervalo [0,10], con incrementos de 0.01, es decir, el vector
contiene los puntos:
x = [0, 0.01, 0.02, 0.03, ..., 9.99, 10]
Luego, al aplicar la funcin sin sobre ese vector, MATLAB evala la funcin seno en cada uno de
los puntos o valores contenidos en el arreglo x y los guarda en y. El captulo 2 (Vectores y matrices)
trata con mayor profundidad la notacin de dos puntos utilizada y el manejo correcto de estructuras
matriciales.
Versin incompleta
17
Bastante interesante, verdad?. Bueno, incluso es posible trazar grficas de superficies tridimensionales con unas cuantas lneas de cdigo:
1
2
3
Versin incompleta
18
Lo mismo podemos leer una imagen y hacerle algunos cambios (restauracin, segmentacin, etc)
utilizando el Image Processing Toolbox (que es una coleccin de cdigos MATLAB que facilitan esta
tarea). Vea el siguiente ejemplo:
1
2
3
4
5
>>
>>
>>
>>
>>
img = imread('lena_std.tif');
img = rgb2gray(img);
filtro = [1 1 1; 1 -8 1; 1 1 1];
img_mod = imfilter(img, filtro);
imshow(255-img_mod)
Imagen original
Versin incompleta
19
Imagen modificada
Todo esto muestra un poco de lo que puede hacer MATLAB, pero, lo cierto es que es un entorno muy
completo con una infinidad de opciones que facilitan el desarrollo de algoritmos para aplicaciones
en mltiples disciplinas cientficas. En los captulos posteriores de este texto se abordan algunas
caractersticas y herramientas proporcionadas por MATLAB para algunos campos especficos.
20
Evite utilizar nombres de funciones nativas de MATLAB o palabras reservadas del lenguaje
que podran ocasionar conflictos.
Para saber cules son las palabras reservadas del lenguaje puede teclear iskeyword en la ventana de
comandos y MATLAB le devolver un cell array de strings:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
>> iskeyword
ans =
'break'
'case'
'catch'
'classdef'
'continue'
'else'
'elseif'
'end'
'for'
'function'
'global'
'if'
'otherwise'
'parfor'
'persistent'
'return'
'spmd'
'switch'
'try'
'while'
>> exist('size')
ans =
5
Si devuelve un resultado diferente de cero, entonces ese nombre est siendo utilizado en una de las
funciones/scripts incluidas en el path de MATLAB.
Ejecutando scripts
La utilidad de los scripts radica en la posibilidad de almacenar comandos de manera estructurada y
poderlos ejecutar posteriormente, para hacerlo puede ir a la opcin Run de la interfaz principal de
MATLAB y entonces se ejecutarn todas las intrucciones que conforman el script.
Versin incompleta
21
Otra forma es ubicarse en la carpeta del script y teclear el nombre del fichero en el Command
Window. Claro que si el fichero no se encuentra en el Current Folder este no se ejecutar,
exceptuando aquellos que sean agreados al Path de MATLAB.
|
principal.m
utils
codigo1.m
codigo2.m
Una solucin evidente (pero muy tosca) es colocar los ficheros codigo1.m y codigo2.m en el mismo
directorio, pero claro, eso implicara tener muchos ficheros en una misma carpeta, lo cual no suele
ser buena idea.
Y la otra solucin consiste en agregar la carpeta utils al path de MATLAB, lo cual es tan sencillo
como ejcutar:
1
Con esto podr llamar los ficheros codigo1.m y codigo2.m desde principal.m sin necesidad de
colocarlos en la misma carpeta.
Versin incompleta
22
La funcin input
La funcin input permite pedir un valor al usuario utilizando una cadena de caracteres como prompt,
la sintaxis es muy sencilla:
1
En la variable var se guarda el valor que el usuario introduzca, los valores aceptados por la funcin
input pueden ser de tipo numrico, cell arrays, e inclusive tipo char. Aunque para introducir cadenas
de texto la funcin input dispone de un modificador que har que la entrada se evale como una
variable tipo char o cadena de texto, la sintaxis para esto es la siguiente:
1
La letra s entre comillas simples le indica a MATLAB que deber evaluar la entrada como tipo string.
>> a=3;
>> disp(a)
3
Para el caso anterior se pasa como argumento la variable a que ha sido declarada previamente
y simplemente se muestra el valor correspondiente a esta. Las variables a mostrar pueden ser de
cualquier tipo, incluyendo cadenas de texto, matrices, cell arrays y estructuras, vanse los siguientes
ejemplos:
Versin incompleta
23
1
2
3
4
5
6
7
8
>> disp(magic(3))
8
1
6
3
5
7
4
9
2
>> disp({1,0,2,-2})
[1]
[0]
[2]
>> disp('Hola Mundo')
Hola Mundo
[-2]
Con disp tambin es posible mostrar enlaces a un sitio web, utilizando la sintaxis HTML para un
enlace dentro de la funcin disp, por ejemplo:
1
2
La funcin fprintf
Con fprintf es posible dar formato a la salida que se quiere imprimir en pantalla, por ejemplo, es
posible especificar el nmero de decimales que se mostrarn o bien si se quiere mostrar como un
entero o quiz como una cadena de texto. La sintaxis de la funcin fprintf es como sigue:
1
fprintf('Especificaciones de formato',a1,...,an);
Donde las especificaciones de formato incluyen uno o ms de los identificadores de un mismo tipo
o combinados que se muestran en la siguiente tabla:
Identificador
%d
%f
%g
%u
%e
%s
%c
Formato de salida
Tipo entero
Tipo coma flotante
Tipo coma flotante compacta
Tipo entero sin signo
Tipo coma flotante, notacin exponencial
Tipo char, cadena de texto
Tipo char, carcter a carcter
>> fprintf('%d',pi);
3.141593e+00>>
Observe que se imprime el valor de en este caso, pero el prompt de la ventana de comandos queda
situado justo despus del valor de salida en la misma lnea, para evitar lo anterior puede utilizar la
Versin incompleta
24
secuencia de escape \n despus del valor a imprimir, lo cual le indica a MATLAB que debe comenzar
en una nueva lnea. Modificamos y vemos el resultado que produce:
1
2
>> fprintf('%d\n',pi);
3.141593e+00
>> fprintf('%f\n',pi);
3.141593
>> fprintf('%g\n',pi);
3.14159
>> fprintf('%e\n',pi);
3.141593e+00
>> fprintf('%u\n',pi);
3.141593e+00
Para las salidas de coma flotante puede especificar el nmero de decimales que tendr la salida, por
ejemplo si desea mostrar solamente dos decimales del nmero :
1
2
>> fprintf('%.2f\n',pi);
3.14
Funciones
Funciones, una introduccin
Las funciones son porciones de cdigo que por lo general aceptan argumentos o valores de entrada
y devuelven un valor de salida. Una funcin es una herramienta muy til en la programacin, dado
que permite la reutilizacin de cdigo para procedimientos que lo requieran, as como una facilidad
significativa para mantener el cdigo, lo cual se traduce en una mayor productividad. MATLAB,
de hecho, est compuesto por una multitud de funciones agrupadas en toolboxs, cada una de ellas
pensada para resolver una situacin concreta.
Una funcin debe definirse en un fichero nico, es decir, por cada funcin creada debemos utilizar
un archivo *.m, mismo que tendr el nombre dado a la funcin.
La estructura bsica de una funcin contiene los siguientes elementos:
La palabra reservada function
Los valores de salida
Versin incompleta
25
El nombre de la funcin
Los argumentos de entrada
Cuerpo de la funcin
Para una mejor comprensin de cada uno de esos elementos, refirase a las siguientes lneas de
cdigo:
1
2
3
La funcin anterior llamada suma, recibe como argumentos de entrada dos valores numricos a y
b, y devuelve un resultado guardado en res que equivale a la suma aritmtica de las variables de
entrada. Note que el valor de retorno debe asignarse a la variable indicada en la lnea de definicin.
Si ejecutamos la funcin en la ventana de comandos obtenemos algo similar a esto:
1
2
3
>> s=suma(3,2)
s =
5
Versin incompleta
26
1
2
3
4
5
6
7
>> s=suma(7)
Error using suma (line 5)
Introduzca dos argumentos de entrada
Sub-funciones
Las sub-funciones son funciones definidas dentro del espacio de otra funcin principal. Se utilizan
como funciones auxiliares con la finalidad de hacer ms legible el cdigo y facilitar la depuracin
de errores. Enseguida se muestra el ejemplo de una sub-funcin:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function r=isfibo(num)
% Determina si un nmero entero forma parte
% de la sucesin de Fibonacci, devuelve un valor
% de tipo lgico.
ff=fibonacci(num);
if any(ff==num)
r=true;
else
r=false;
end
function F=fibonacci(n)
F(1:2)=1;
i=3;
while 1
F=[F F(i-1)+F(i-2)];
if F(end) >= n,break,end;
i=i+1;
end
end
end
Versin incompleta
27
La funcin anterior isfibo determina si el entero pasado como argumento de entrada pertenece a la
sucesin de Fibonacci, para ello utiliza como una funcin auxiliar a la sub-funcin fibonacci que se
encarga de generar la sucesin de Fibonacci en un intervalo dado y guardarlo en un vector de salida.
Una sub-funcin puede ser llamada solamente por la funcin principal que la contiene.
Argumentos variables
En la introduccin a las funciones se ha mencionado que estas por lo general tienen un nmero
especfico de argumentos de entrada y salida, no obstante se presentan situaciones en donde los
argumentos de entrada o salida de una funcin no son fijos o bien los argumentos pueden ser
demasiados de tal modo que resulte incmodo definirlos en la lnea correspondiente. Para solucionar
lo anterior MATLAB permite el uso de varargin y varargout como argumentos de entrada y salida
respectivamente. Para tener una idea ms prctica de lo anterior vase el ejemplo siguiente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function m=max2(varargin)
if nargin==1
v=varargin{1};
m=v(1);
for i=2:length(v)
if v(i)>m
m=v(i);
end
end
elseif nargin==2
a=varargin{1};
b=varargin{2};
if a>b
m=a;
else
m=b;
end
end
end
La funcin anterior max2 emula a la funcin nativa max, puede recibir como argumento de entrada
un vector o bien dos valores escalares. Si observa el cdigo anterior notar que varargin es un cell
array que guarda todos los argumentos de entrada pasados a la funcin, como se ver en el captulo
3 la manera de acceder a los elementos de un cell array es utilizando la sintaxis: var{k}, donde var
es la variable en la que est almacenada el cell array y k es el k-simo elemento contenido en el cell
array.
Versin incompleta
28
function [x1,x2]=ecuad(a,b,c)
% Resuelve una ecuacin cuadrtica de la forma:
% a*x^2+b*x+c=0
%
% Argumentos de entrada:
%
a - Coeficiente cuadrtico
%
b - Coeficiente lineal
%
c - Coeficiente constante
%
% Argumentos de salida:
%
x1,x2 - Races de la ecuacin cuadrtica
%
% Ejemplo:
%
>> [r1,r2]=ecuad(-1,2,1);
%
x1=(1/(2*a))*(-b+sqrt(b^2-4*a*c));
x2=(1/(2*a))*(-b-sqrt(b^2-4*a*c));
end
Podemos teclear help ecuad en la ventana de comandos y verificar lo que MATLAB nos devuelve
como ayuda de la funcin:
Versin incompleta
29
1
2
3
4
5
6
7
8
9
10
11
Es comn agregar a la ayuda de una funcin algunas referencias hacia otras funciones similares,
para ello en los comentarios debe agregar una lnea que comience con las palabras SEE ALSO (Ver
tambin), seguidas de las funciones similares separadas por comas, vase el ejemplo a continuacin:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function [x1,x2]=ecuad(a,b,c)
% Resuelve una ecuacin cuadrtica de la forma:
% a*x^2+b*x+c=0
%
% Argumentos de entrada:
%
a - Coeficiente cuadrtico
%
b - Coeficiente lineal
%
c - Coeficiente constante
%
% Argumentos de salida:
%
x1,x2 - Races de la ecuacin cuadrtica
%
% Ejemplo:
%
>> [r1,r2]=ecuad(-1,2,1);
%
% SEE ALSO roots,solve,fzero
%
x1=(1/(2*a))*(-b+sqrt(b^2-4*a*c));
x2=(1/(2*a))*(-b-sqrt(b^2-4*a*c));
end
>> help ecuad
Resuelve una ecuacin cuadrtica de la forma:
a*x^2+b*x+c=0
Argumentos de entrada:
Versin incompleta
30
27
28
29
30
31
32
33
34
35
a - Coeficiente cuadrtico
b - Coeficiente lineal
c - Coeficiente constante
Argumentos de salida:
x1,x2 - Races de la ecuacin cuadrtica
Ejemplo:
>> [r1,r2]=ecuad(-1,2,1);
SEE ALSO roots,solve,fzero
Bifurcaciones y bucles
Sentencia if-elseif-else
La sentencia if se utiliza como bifurcacin simple por s sola, es decir, en aquellas situaciones en las
cuales se requiera evaluar solamente una condicin, por ejemplo, suponga que tiene dos nmeros a
y b y necesita comprobar si son iguales y ejecutar una accin, para ello bastara con una sentencia
if simple:
1
2
3
if a==b
disp('a es igual a b');
end
A diferencia del caso anterior hay situaciones que requieren la ejecucin de una accin cuando
la condicin se cumpla y de otra en caso contrario, entonces puede utilizarse una bifurcacin doble
formada por las sentencias if-else. Retomando el ejemplo para la bifurcacin if simple, podramos
modificarlo de tal manera que enve tambin un mensaje (ejecute una accin) para cuando la
condicin no se cumple:
1
2
3
4
5
if a==b
disp('a es igual a b');
else
disp('a es diferente de b');
end
Ahora imagine que para los ejemplos anteriores se necesita especificar si a=b, si a > b o bien si
a < b, lo cual implicara tener una sentencia de seleccin mltiple if-elseif-else que permite
escoger entre varias opciones, evalundose en orden descendente, por ejemplo refirase a la siguiente
estructura:
Versin incompleta
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if cond1
% Instrucciones
elseif cond2
% Instrucciones
elseif cond3
% Instrucciones
.
.
.
elseif condN
% Instrucciones
else
% Instrucciones
end
if a==b
disp('a es igual que b');
elseif a>b
disp('a es mayor que b');
elseif a<b
disp('a es menor que b');
end
Sentencia switch
La sentencia switch es una bifurcacin mltiple que permite seleccionar entre varias opciones o
casos la accin a ejecutar. La sintaxis general es:
Versin incompleta
32
1
2
3
4
5
6
7
8
9
10
11
switch var
case opc1
% Instrucciones
case opc2
% Instrucciones
.
.
.
otherwise
% Intrucciones
end
Siendo var la variable que servir como criterio de seleccin. Despus de la palabra reservada case,
se coloca el valor de var para el cual se ejecutarn esas instrucciones, y en otherwise se insertan
las instrucciones que MATLAB deber ejecutar por defecto en caso de no cumplirse ninguno de los
casos especificados.
Enseguida se muestran dos ejemplos correspondientes a la sentencia de seleccin switch:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
X=input('Inserte 0 o 1: ');
switch X
case 0
disp('Insert cero');
case 1
disp('Insert uno');
otherwise
warning('Valor incorrecto, verifique');
end
Bucle for
La sintaxis general de un bucle for se muestra enseguida:
Versin incompleta
33
1
2
3
for i=inicio:incremento:fin
% Instrucciones...
end
El valor inicio es a partir del cual se ejecutar el ciclo, el incremento es la cantidad que vara en cada
paso de ejecucin, y el valor de final establece el ltimo valor que tomar el ciclo.
El siguiente cdigo muestra un ciclo for muy bsico, el cual simplemente muestra en consola el valor
actual adquirido por la variable.
1
2
3
for i=1:10
fprintf('Valor actual: %g \n',i);
end
Cuando no se especifica el incremento, como el caso anterior, MATLAB asume que es unitario.
Es posible utilizar ciclos for anidados, por ejemplo para cuando se requiere recorrer una matriz en
sus dos dimensiones y ejecutar operaciones elemento por elemento. Vase el siguiente ejemplo:
1
2
3
4
5
6
A=round(rand(5)*10);
for i=1:5
for j=1:5
disp(A(i,j));
end
end
Bucle while
El bucle while se utiliza, por lo general, cuando no se tiene un rango definido sobre el cual se realice
la ejecucin del ciclo o bien cuando la terminacin del mismo viene dada por una condicin. La
sintaxis ms comn es:
1
2
3
4
5
6
while
%
%
%
%
end
cond
Instrucciones
...
...
...
34
1
2
3
4
5
k=1;
while k<10
disp(k);
k=k+1;
end
Lo anterior muestra en consola el valor de k mientras esta sea menor a 10, es decir muestra todos
los valores enteros en el intervalo [1, 9], es importante notar que la variable k debe incrementarse
en cada ciclo para que en un momento determinado la condicin de finalizacin se cumpla, de lo
contrario se convertira en un bucle infinito.
Ahora, veamos un ejemplo ms prctico. La aproximacin de una raz cuadrada por el mtodo
babilnico implica realizar n iteraciones mediante la siguiente expresin:
1 x
rn (x) = (
+ rn1 )
2 rn1
Donde x es el nmero del cual se calcula la raz cuadrada. A continuacin se muestra el cdigo
implementado en MATLAB utilizando un bucle while:
1
2
3
4
5
6
7
8
Como se observa, en la variable ra se guarda la raz aproximada calculada en una iteracin anterior,
de manera que esta sirva como comparacin respecto a la nueva raz calculada, el bucle termina
cuando la diferencia entre el valor actual y el anterior es inferior a la tolerancia numrica (eps)
soportada por MATLAB y por ende pasan a considerarse como valores iguales.
Versin incompleta
35
while true
a = randi(10);
if a>5
break;
end
end
Fecha y hora
Primeramente es importante mencionar que MATLAB maneja tres formatos de fechas y hora, a
saber:
Un vector de seis elementos los cuales son: [ao, mes, da, hora, minuto, segundo].
Un valor escalar de coma flotante (tipo double), en el cual la parte entera representa la cantidad
de das que han transcurrido desde el ao cero (calendario gregoriano) y la parte decimal
representa la fraccin del da trascurrido.
Una cadena de texto con la forma dd-mmm-aaa HH:MM:SS.
Para obtener la fecha actual MATLAB proporciona el comando now:
1
2
3
>> now
ans =
7.3575e+05
Lo anterior podra resultar til para efectos de clculo pero no es tan significativo para el usuario
que est acostumbrado a visualizar la fecha y hora mediante los formatos convencionales; podemos
convertir el valor numrico anterior a una cadena de texto que nos proporcione mayor informacin
a primer vista, para ello se utiliza la funcin datestr como sigue:
1
2
3
>> datestr(now)
ans =
03-Jun-2014 17:09:36
Versin incompleta
36
Adems de las anteriores MATLAB dispone de las funciones datevec y clock, la primera convierte
una determinada fecha pasada como argumento en formato string o numrico a un vector de seis
elementos como se describi anteriormente, y clock devuelve la fecha y hora actual tal como la hace
now pero como un vector de seis elementos.
Versin incompleta
37
vD
Versin incompleta
38
Problemas
1.1 Qu tipo de dato devuelve cada una de las siguientes instrucciones? (Puede verificar utilizando
la funcin class).
1
2
3
4
>>
>>
>>
>>
3;
true;
3==2;
{1,2,3};
Versin incompleta
39
1
2
3
4
5
>>
>>
>>
>>
>>
3+int8(2);
true+5;
int8(10)+int16(5);
{1,2,3}+{0,1,0};
[5,1,-2]+[2 3 0];
1.3 Desarrolle un script que le solicite su nombre (utilice la funcin input) y que devuelva un saludo
ms el nombre ingresado, por ejemplo: Hola Jorge, bienvenido.
1.4 Identifique el error en las siguientes lneas de cdigo:
1
2
3
4
5
6
1.5 Utilizando la escala de calificacin del 0 a 10 y siendo 6 la calificacin mnima aprobatoria, cree
un programa en el cual ingrese una calificacin y este le devuelva un mensaje de APROBADO o NO
APROBADO en el caso que corresponda.
1.6 El siguiente es un problema clsico en los cursos bsicos de programacin: escriba un programa
que determine si un nmero ingresado es par o impar.
1.7 Escriba una funcin llamada sfibonacci, que reciba como argumento un entero positivo n, y
que devuelva un vector con los primeros n trminos de la sucesin de Fibonacci.
1.8 Desarrolle una funcin llamada bucle_test, que reciba como argumento de entrada un nmero
entero N. Esta funcin debe recorrer todos los valores enteros en el rango de 1 a N mostrando n
es divisible por 2, n es divisible por 3, n es divisible por 2 y 3 o n no es divisible por 2 o
3 (donde n ser el valor actual). Use un bucle for para recorrer los valores, la funcin rem para
verificar la divisibilidad y num2str para convertir cada nmero en un string y mostrarlo en pantalla.
Para verificar cada caso puede utilizar una bifurcacin mltiple if-elseif-else.
1.9 Escriba una funcin que le permita determinar si un nmero entero pasado como argumento es
primo, en caso de serlo devolver un valor lgico true y un valor false en caso contrario. (La funcin
isprime de MATLAB realiza la misma operacin).
Danilo epanovi. 6.094 Introduction to MATLAB, January IAP 2010. (Massachusetts Institute of Technology: MIT OpenCourseWare),
http://ocw.mit.edu (Accessed).
Versin incompleta