You are on page 1of 45

Programacin en MATLAB - Funciones

Funciones en MATLAB
Una cualidad de MATLAB es la de permitir generar nuestras
propias funciones para un problema especfico que queramos
resolver.
De esta forma ampliamos la potencia de MATLAB ya que estas
nuevas funciones adaptadas a nuestras necesidades se
pueden utilizar del mismo modo que las que ya tiene MATLAB
predefinidas, como son por ejemplo, det, size, sum, ...

Funciones en MATLAB (cont.)


Un fichero de funcin siempre comienza con la palabra clave
function
Seguidamente y entre corchetes aparecen los parmetros de
salida que deseemos obtener
A continuacin el signo igual, seguido del nombre que
queramos darle a la funcin
Finalmente entre parntesis, los parmetros de entrada que
sean necesarios.
function [parmetros de salida] = nombre(parmetros de entrada)

Funciones en MATLAB (cont.)


Hay que tener en cuenta que la funcin se localiza por el
nombre del archivo.
Por lo que conviene que ste coincida con el que figura en la
declaracin function para evitar confusiones.
Como cualquier fichero en MATLAB, las funciones m se crean
en el Editor de MATLAB.
Un primera forma de hacerlo sera ejecutando la orden:

O travs del teclado


Ctrl + N

Creando funciones
De esta forma se abre una nueva ventana en la que podemos
teclear la declaracin de funcin.

Creando funciones (cont.)


A travs de la cinta de
herramientas en HOME\FILE\

Creando funciones (cont.)

Observaciones
Se define el nombre y las variables de entrada y salida:
function c = myfile(a, b)
Las lneas de comentario se inician con el caracter %.
Las lneas de comentario posteriores a la funcin son de
ayuda
function c = myfile(a, b)
% Output: c. Input: a y b

Usando la funcion help.


>> help myfile
Output: c. Input: a y b

Tipos de variables
Clase

Ejemplo

Descripcin

array

[1, 2; 3, 4]; 5 + 6*i

Datos ordenados por


ndices cuyos componentes
son datos del mismo tipo

char

hola

Array de caracteres (cada


carcter tiene 16 bits)

cell

{17, hola, eye(2)}

Datos ordenados por


ndices cuyos componentes
son arrays de distinto tipo

struct

a.dia = 1; a.mes = Julio

Almacenan datos por


campos (estructura). Cada
campo es un array o celda.

object

tf(1, [1,1])

Datos definidos por el


usuario con base a una
estructura y con funciones
asociadas

Variables de entrada-salida
Libertad en su nmero. La variable nargin y nargout indican su
nmero
Variables locales por defecto sin tipo determinado
Ejemplo: a, b, y c pueden ser double or array
function c = myfile2(a, b, c)
%MYFILE2 Ejemplo 2 de funcion
%
Output: c . Input: a, b y c
if nargin < 2
error('c = myfile2(a, b, [c])');
elseif nargin == 2
c = sqrt(a.^2 + b.^2);
else
c = sqrt(a.^2 + b.^2 + c.^2);
end

Celdas como variables de entrada


Una celda varargin como variable de entrada y otra varargout
como salida. Ejemplo myfile3.m:
function c = myfile3(varargin)
%MYFILE3 Ejemplo 3 de funcion con varargin
%
Output: c . Input: a, b y c
if nargin < 2
error('c = myfile2(a, b, [c])');
elseif nargin == 2
c = sqrt(varargin{1}.^2 + varargin{2}.^2);
else
c = sqrt(varargin{1}.^2 + varargin{2}.^2 + varargin{3}.^2);
end

Ejemplo con varargout


Una celda varargout como variable de salida, y nargout
cuenta las variables de salida. Ejemplo misize.m:
function [s, varargout] = mysize(x)
%MYSIZE Retorna el tamao del vector
%
y opcionalmente
%
los tamaos individuales
nout = max(nargout,1) - 1;
s = size(x);
for k=1:nout
varargout{k} = s(k);
end

Ms ejemplos de funciones en
MATLAB
Supongamos que para una matriz dada necesitamos saber
cul es su diagonal recorrida de abajo hacia arriba.
Vamos a crear una funcin, llamada diagonal, que admita
como argumento de entrada una matriz y devuelva un vector
que contenga la informacin buscada.
Para ello utilizamos el editor de MATLAB para crear un m
fichero con las siguientes rdenes

diagonal.m

diagonal.m (cont.)
Ejecutar las siguientes instrucciones en el
prompt del Command Window de MATLAB:

Otro ejemplo
Aunque en este sencillo ejemplo se tienen un
solo argumento de entrada y un solo
argumento de salida, en general, se pueden
tener o no varios argumentos de entrada
como de salida.

mifuncion.m
Ahora ser empleada.

Vectorizacin de una funcin


Se observa que hay un cierto inconveniente con que la
funcin no est vectorizada. Con un pequeo arreglo, se
vectoriza para poder evaluar la funcin para vectores.
function f = mifuncion_v(x, y)
%MIFUNCION_V.m version vectorizada de mifuncion.m
%
Retorna el valor f de evaluar la expresion
%
f = y.*(1-y) + x, dados los valores x e y
f = y.*(1-y) + x;

En este caso slo debemos vectorizar el producto (.*) pues la


suma ya es una operacin que se realiza de forma
vectorizada.

Vectorizacin de una funcin (cont.)


Se ejecuta la siguiente instruccin
>> mifuncion_v([0 3 4],[1 2 1])
ans =
0
1
4

obtenemos un vector con el valor de la funcin


en (0; 1), (3; 2) y (4; 1), respectivamente.

Vectorizacin de una funcin (cont.)


Advertencia. Cuando una funcin de dos variables se vectoriza,
hay que enviar como argumentos de entrada matrices de la
misma dimensin (o de dimensiones compatibles si la definicin
es ms compleja) porque la vectorizacin supone que se evala
en pares de valores que ocupan la misma posicin.
Es decir, si enviamos dos vectores

Se estar evaluando en los pares (xi; yi). Si se quiere cruzar


todos los xi con todos los yi , hay que emplear la instruccin
meshgrid.
Este tipo de evaluaciones se encuentran frecuentemente en los
grficos de funciones bidimensionales.

Ejemplo: mifuncion_p.m
function [f, promedio] = mifuncion_p(x, y)
%MIFUNCION_P.m version vectorizada de
mifuncion.m
%
Retorna el valor f de evaluar la expresion
%
f = y.*(1-y) + x, y ademas de su promedio
%
dados los valores x e y
f = y.*(1-y) + x;
promedio = sum(f)/length(x);
return
% opcional

Ahora se tiene dos argumentos de salida, f y promedio.


El primero de ellos siempre es un dato que se devuelve.
Para el segundo (y en general para los siguientes), podemos
elegir si devolverlos o no.

mifuncion_p.m (cont.)
>> valor = mifuncion_p([0 3 4], [1 2 1])
valor =
0
1
4
>> [valor media] = mifuncion_p([0 3 4], [1 2 1])
valor =
0
1
4
media =
1.6667
>>

En esta ltima modificacin de mifuncion.m se ha


aadido la orden return con lo que se vuelve al
modo interactivo.

Indicaciones generales

A diferencia de lo que ocurre con otros lenguajes de


programacin return no es necesaria al final de la
definicin de la funcin. Su empleo es comn cuando se
quiere salir de la funcin si se cumple algn tipo de condicin.
Advertencia. Los argumentos de salida que se exportan
(asignan a variables en consola o en otras funciones) van
siempre por orden, de izquierda a derecha.
No se pueden exportar el primer y el tercer argumento sin exportar el
segundo.

No hay ningn problema en que una mfuncin llame a otra


mfuncin, siempre que no se entre en un ciclo recursivo, es
decir, que siguiendo el rastro de llamadas de una funcin a
otra funcin se regrese a la original.
La recursividad existe en MATLAB pero hay que tratarla de
una manera especial.

Variables Globales y Estticas


En la definicin de una funcin (al igual que en cualquier
lenguaje de programacin) los nombres de las variables son
mudos, es decir, se entienden y definen nicamente dentro
del fichero, sin relacin con las variables exteriores.
Variable esttica: No se pierde su valor y slo se puede usar
en la funcin definida.
Variable global: No se pierde su valor y se puede usar en
todas las funciones donde est definida. Debe estar definida
en el workspace.

Variables Globales
Ejemplo. Construir y guardar la siguiente funcin,
completamente trivial. La instruccin a=4 no hace nada
relevante, ya que realiza una asignacin interna que no se
exporta.

Variables Globales (cont.)


Se ejecuta la funcin f, en el contexto de la consola, a es una
variable global.
No obstante, como sta no ha sido declarada as en la funcin
f, ni el valor en consola se importa a la funcin, ni el valor
dentro de la funcin se exporta.

Variables Globales (cont.)


Ahora se cambia la funcin para que a sea variable global
dentro de la funcin tambin.

Variables Globales (cont.)


En este caso, tras ejecutar la funcin, el valor
de la variable a pasa a ser a=4.

Variables Globales (cont.)


Las variables globales son variables de entrada y salida
simultneamente sin que aparezcan en ninguna de las dos
listas (listas de argumentos de entrada ni de salida).
Sirven para poder transmitir listas largas de parmetros de la
consola a una subrutina o al revs, sin incluirlas en las
definiciones de las funciones.
Las variables globales se definen y emplean nicamente en el
contexto donde estn declaradas.
Pueden estar perfectamente definidas en un grupo de m
funciones y no en la consola. En tal caso, no podemos acceder
a su valor en consola, pero s en cualquier funcin que las
declare.

Variables Globales (cont.)


Por ejemplo, adems de la funcin f anterior,
construimos otra funcin, llamada g.

Variables Globales (cont.)


En la siguiente cadena de ejecuciones (se
borra a en la consola), se ve claramente cmo
se transmite el valor de a de una funcin a
otra sin que pase por consola.

Variables Globales (cont.)


Al igual que todas las variables empleadas en una sesin estn
almacenadas en la memoria a la que se accede desde la
consola (en el workspace), todas las variables globales estn
almacenadas en una memoria global a la que se puede
acceder parcialmente a travs del comando global

Subfunciones
Varias funciones contenidas en un mismo fichero.
La funcin principal es la primera. Equivalente a la funcin
main del lenguaje C.
function c = myfile_sub(a, b)
%MYFILE_SUB.M Ejemplo de subfunciones
%
Output: c. Input: a y b
c = fun(a, b);

function z = fun(x, y)
z = sqrt(x.^2 + y.^2);

Funciones Como Argumento de Otras


Funciones
El nombre de una funcin f.m es la cadena de caracteres
anterior a la extensin y con comillas:
f
El handle es la siguiente expresin
@f
Un tipo especfico de datos de MATLAB.

Funciones Como Argumento de Otras


Funciones
Para el siguiente ejemplo suponemos que
tenemos definida una funcin f.m

Funciones Como Argumento de Otras


Funciones
Para evaluar una funcin se puede emplear feval (function
evaluation) que permite evaluar una funcin en uno o varios
puntos.
El primer argumento de feval es el nombre de la funcin o su
handle.
Despus se dan los argumentos donde se quiere evaluar esta
funcin.
La siguiente funcin, con dos argumentos, est vectorizada.

Funciones Como Argumento de Otras


Funciones

Las instrucciones siguientes dan evaluaciones de


esta funcin en los puntos (2; 3) y (1; 4).

Funciones Como Argumento de Otras


Funciones

Entrada de Datos
input(): Introduccin de datos INscript.m,
n = input('Intr. dato: ') ; % Double.
n = input('Intr. dato: ', 's') ;
% Cadena de caracteres.
ginput(): Localizar puntos en una grfica con el ratn,
figure; plot(1:1000);
[x,y]= ginput(1) % localizar un punto x,y
en grafica.
[x,y,tecla] = ginput(3) % tecla de la
tecla del ratn usada
Consulte el uso de dataimport

Salida de Datos
save: Grabar datos en ficheros OUTscript.
-mat: Cdigo binario (por defecto)
-ascii: Cdigo ASCII
-append: Graba al final del fichero

load: Recupera las variables guardadas con la sentencia save.

Salida de Datos
save: Grabar datos en ficheros OUTscript.
-mat: Cdigo binario (por defecto)
-ascii: Cdigo ASCII
-append: Graba al final del fichero

load: Recupera las variables guardadas con la sentencia save.

Funciones de Librera Entrada/Salida


Algunas de las funciones de entrada/salida:

Funciones de Librera Entrada/Salida


Ejemplos de apertura y cierre. Permisos:
'r': Lectura. Puntero al inicio del fichero.
'w': Escritura. Se borra el fichero si existe.
'a': Aadir. Puntero al final del fichero.
'r+': Lectura/escritura. Puntero al inicio.
Principales usos:
Ficheros de texto con formato
Ficheros binarios para guardar o extraer matrices en su
forma vectorial.

Funciones de Librera Entrada/Salida


Guardar archivo de texto
a = rand(3, 3)
fileID = fopen('datos_texto.txt', 'w'); %
Guardar texto
fprintf(fileID, '%.2f %.2f %.2f\n', a);
fclose(fileID);
fileID = fopen('datos_texto.txt', 'r'); %
Recupera texto
b = fscanf(fileID, '%f')
fclose(fileID);

Funciones de Librera Entrada/Salida


Guardar archivo binario
a = rand(3, 3)
fileID = fopen('datos_binario.txt', 'w'); %
Guardar binario
fwrite(fileID, a, 'real*4');
fclose(fileID);
fileID = fopen('datos_binario.txt', 'r'); %
Recupera binario
b = fread(fileID, inf, 'real*4')
fclose(fileID);

You might also like