45
1 Programación en MATLAB - Funciones

Funciones en MATLAB

Embed Size (px)

DESCRIPTION

Programación de funciones en MATLAB

Citation preview

Page 1: Funciones en MATLAB

1

• Programación en MATLAB - Funciones

Page 2: Funciones en MATLAB

Funciones en MATLAB

• Una cualidad de MATLAB es la de permitir generar nuestras propias funciones para un problema específico 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, ...

Page 3: Funciones en MATLAB

Funciones en MATLAB (cont.)

• Un fichero de función siempre comienza con la palabra clave function

• Seguidamente y entre corchetes aparecen los parámetros de salida que deseemos obtener

• A continuación el signo igual, seguido del nombre que queramos darle a la función

• Finalmente entre paréntesis, los parámetros de entrada que sean necesarios. function [parámetros de salida] = nombre(parámetros de entrada)

Page 4: Funciones en MATLAB

Funciones en MATLAB (cont.)

• Hay que tener en cuenta que la función se localiza por el nombre del archivo.

• Por lo que conviene que éste coincida con el que figura en la declaración function para evitar confusiones.

• Como cualquier fichero en MATLAB, las funciones m se crean en el Editor de MATLAB.

• Un primera forma de hacerlo sería ejecutando la orden:

• O través del teclado Ctrl + N

Page 5: Funciones en MATLAB

Creando funciones

• De esta forma se abre una nueva ventana en la que podemos teclear la declaración de función.

Page 6: Funciones en MATLAB

Creando funciones (cont.)

• A través de la cinta de herramientas en HOME\FILE\

Page 7: Funciones en MATLAB

Creando funciones (cont.)

Page 8: Funciones en MATLAB

Observaciones

• Se define el nombre y las variables de entrada y salida: function c = myfile(a, b) • Las líneas de comentario se inician con el caracter %. • Las líneas de comentario posteriores a la función 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

Page 9: Funciones en MATLAB

Tipos de variables Clase Ejemplo Descripción

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 carácter 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

Page 10: Funciones en MATLAB

Variables de entrada-salida

• Libertad en su número. La variable nargin y nargout indican su número

• 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

Page 11: Funciones en MATLAB

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

Page 12: Funciones en MATLAB

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 tamaño del vector % y opcionalmente % los tamaños individuales nout = max(nargout,1) - 1; s = size(x); for k=1:nout varargout{k} = s(k); end

Page 13: Funciones en MATLAB

Más ejemplos de funciones en MATLAB

• Supongamos que para una matriz dada necesitamos saber cuál es su diagonal recorrida de abajo hacia arriba.

• Vamos a crear una función, llamada diagonal, que admita como argumento de entrada una matriz y devuelva un vector que contenga la información buscada.

• Para ello utilizamos el editor de MATLAB para crear un m–fichero con las siguientes órdenes

Page 14: Funciones en MATLAB

diagonal.m

Page 15: Funciones en MATLAB

diagonal.m (cont.)

• Ejecutar las siguientes instrucciones en el prompt del Command Window de MATLAB:

Page 16: Funciones en 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.

Page 17: Funciones en MATLAB

mifuncion.m

• Ahora será empleada.

Page 18: Funciones en MATLAB

Vectorización de una función

• Se observa que hay un cierto inconveniente con que la función no esté vectorizada. Con un pequeño arreglo, se vectoriza para poder evaluar la función para vectores.

• En este caso sólo debemos vectorizar el producto (.*) pues la suma ya es una operación que se realiza de forma vectorizada.

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;

Page 19: Funciones en MATLAB

Vectorización de una función (cont.)

• Se ejecuta la siguiente instrucción

• obtenemos un vector con el valor de la función en (0; 1), (3; 2) y (4; 1), respectivamente.

>> mifuncion_v([0 3 4],[1 2 1]) ans = 0 1 4

Page 20: Funciones en MATLAB

Vectorización de una función (cont.) • Advertencia. Cuando una función de dos variables se vectoriza,

hay que enviar como argumentos de entrada matrices de la misma dimensión (o de dimensiones compatibles si la definición es más compleja) porque la vectorización supone que se evalúa en pares de valores que ocupan la misma posición.

• 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 instrucción meshgrid.

• Este tipo de evaluaciones se encuentran frecuentemente en los gráficos de funciones bidimensionales.

Page 21: Funciones en MATLAB

Ejemplo: mifuncion_p.m

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

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

Page 22: Funciones en MATLAB

mifuncion_p.m (cont.)

• En esta última modificación de mifuncion.m se ha añadido la orden return con lo que se vuelve al modo interactivo.

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

Page 23: Funciones en MATLAB

Indicaciones generales • A diferencia de lo que ocurre con otros lenguajes de

programación return no es necesaria al final de la definición de la función. Su empleo es común cuando se quiere salir de la función si se cumple algún tipo de condición.

• 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 ningún problema en que una m–función llame a otra m–función, siempre que no se entre en un ciclo recursivo, es decir, que siguiendo el rastro de llamadas de una función a otra función se regrese a la original.

• La recursividad existe en MATLAB pero hay que tratarla de una manera especial.

Page 24: Funciones en MATLAB

Variables Globales y Estáticas

• En la definición de una función (al igual que en cualquier lenguaje de programación) los nombres de las variables son mudos, es decir, se entienden y definen únicamente dentro del fichero, sin relación con las variables exteriores.

• Variable estática: No se pierde su valor y sólo se puede usar en la función 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.

Page 25: Funciones en MATLAB

Variables Globales

• Ejemplo. Construir y guardar la siguiente función, completamente trivial. La instrucción a=4 no hace nada relevante, ya que realiza una asignación interna que no se exporta.

Page 26: Funciones en MATLAB

Variables Globales (cont.)

• Se ejecuta la función f, en el contexto de la consola, ‘a’ es una variable global.

• No obstante, como ésta no ha sido declarada así en la función f, ni el valor en consola se importa a la función, ni el valor dentro de la función se exporta.

Page 27: Funciones en MATLAB

Variables Globales (cont.)

• Ahora se cambia la función para que a sea variable global dentro de la función también.

Page 28: Funciones en MATLAB

Variables Globales (cont.)

• En este caso, tras ejecutar la función, el valor de la variable ‘a’ pasa a ser a=4.

Page 29: Funciones en MATLAB

Variables Globales (cont.)

• Las variables globales son variables de entrada y salida simultáneamente sin que aparezcan en ninguna de las dos listas (listas de argumentos de entrada ni de salida).

• Sirven para poder transmitir listas largas de parámetros de la consola a una subrutina o al revés, sin incluirlas en las definiciones de las funciones.

• Las variables globales se definen y emplean únicamente en el contexto donde estén 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 función que las declare.

Page 30: Funciones en MATLAB

Variables Globales (cont.)

• Por ejemplo, además de la función f anterior, construimos otra función, llamada g.

Page 31: Funciones en MATLAB

Variables Globales (cont.)

• En la siguiente cadena de ejecuciones (se borra a en la consola), se ve claramente cómo se transmite el valor de a de una función a otra sin que pase por consola.

Page 32: Funciones en MATLAB

Variables Globales (cont.)

• Al igual que todas las variables empleadas en una sesión están almacenadas en la memoria a la que se accede desde la consola (en el workspace), todas las variables globales están almacenadas en una memoria global a la que se puede acceder parcialmente a través del comando global

Page 33: Funciones en MATLAB

Subfunciones

• Varias funciones contenidas en un mismo fichero. • La función principal es la primera. Equivalente a la función

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

Page 34: Funciones en MATLAB

Funciones Como Argumento de Otras Funciones

• El nombre de una función f.m es la cadena de caracteres anterior a la extensión y con comillas:

‘ f ’

• El handle es la siguiente expresión

@f

• Un tipo específico de datos de MATLAB.

Page 35: Funciones en MATLAB

Funciones Como Argumento de Otras Funciones

• Para el siguiente ejemplo suponemos que tenemos definida una función f.m

Page 36: Funciones en MATLAB

Funciones Como Argumento de Otras Funciones

• Para evaluar una función se puede emplear feval (function evaluation) que permite evaluar una función en uno o varios puntos.

• El primer argumento de feval es el nombre de la función o su handle.

• Después se dan los argumentos donde se quiere evaluar esta función.

• La siguiente función, con dos argumentos, está vectorizada.

Page 37: Funciones en MATLAB

Funciones Como Argumento de Otras Funciones

• Las instrucciones siguientes dan evaluaciones de esta función en los puntos (2; 3) y (1; 4).

Page 38: Funciones en MATLAB

Funciones Como Argumento de Otras Funciones

Page 39: Funciones en MATLAB

Entrada de Datos

• input(): Introducción de datos INscript.m, • n = input('Intr. dato: ') ; % Double. • n = input('Intr. dato: ', 's') ; • % Cadena de caracteres.

• ginput(): Localizar puntos en una gráfica con el ratón, • 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 ratón usada

• Consulte el uso de dataimport

Page 40: Funciones en MATLAB

Salida de Datos

• save: Grabar datos en ficheros OUTscript. -mat: Código binario (por defecto) -ascii: Código ASCII -append: Graba al final del fichero

• load: Recupera las variables guardadas con la sentencia save.

Page 41: Funciones en MATLAB

Salida de Datos

• save: Grabar datos en ficheros OUTscript. -mat: Código binario (por defecto) -ascii: Código ASCII -append: Graba al final del fichero

• load: Recupera las variables guardadas con la sentencia save.

Page 42: Funciones en MATLAB

Funciones de Librería Entrada/Salida

• Algunas de las funciones de entrada/salida:

Page 43: Funciones en MATLAB

Funciones de Librería Entrada/Salida

• Ejemplos de apertura y cierre. Permisos: 'r': Lectura. Puntero al inicio del fichero. 'w': Escritura. Se borra el fichero si existe. 'a': Añadir. 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.

Page 44: Funciones en MATLAB

Funciones de Librería 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);

Page 45: Funciones en MATLAB

Funciones de Librería 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);