PROGRAMACIÓN DE MATLAB MATLAB es una aplicación que se puede programar muy fácilmente. g j de programación p g pronto p verá que q no tiene De todas formas,, como lenguaje tantas posibilidades como otros lenguajes (ni tan complicadas...). Se comenzará viendo las bifurcaciones y bucles bucles, y la lectura y escritura interactiva de variables, que son los elementos básicos de cualquier programa de una cierta complejidad. complejidad. La programación en MATLAB se realiza básicamente en archivos *.m o M-files Estos archivos son simplemente archivos ASCCII o scripts y como tales pueden ser creados o modificados en cualquier editor de texto De acuerdo a como se definan estos archivos pueden separarse en dos tipos: Archivos de comandos (scripts) Funciones PROCESO PARA EL DISEÑO DE UN PROGRAMA INICIO State the problem you are trying t i to t solve l Define required inputs and outputs Descomposition Design the algorithm Convert algorithm into MATLAB statements Test the resulting MATLAB program Finished Stepwise refinement Top--down desing process Top Proceso típico de prueba para un programa largo INICIO Unit testing of individual subtasks Subtasks validated separately Succesives builds (adding subtaks to the program) As many time as necesary Subtasks combined into program Alpha release As many time as necesary Worst bugs fixed Beta release Minor bugs fixed Finished As many time as necesary PROGRAMACIÓN DE MATLAB L secciones Las i de d un código ódi de d computadora t d (programa), ( ) se identifican id tifi como secuencias,, estructuras de selección y estructuras de repetición. secuencias Secuencias Una secuencia es una lista de comandos que son ejecutados uno después de otro. otro. Estructuras de selección Una estructura de selección permite al programador ejecutar un comando si el criterio es verdadero y un segundo comando si el criterio es falso.. falso Estructuras de repetición. Una estructura de repetición (loop) loop) considera un grupo de d sentencias t i a ser ejecutadas en múltiples tiempos PROGRAMACIÓN DE MATLAB Di Diagramas de d Flujo Fl j y seudocódigo. d ódi Los diagramas g de flujo, j , son aproximaciones p graficas g de apoyo p y en la planeación de un programa (código). El seudocódigo es la descripción verbal de la planeación del programa. Diagramas de flujo para el diseño de programas de computadora Un ovalo es utilizado para indicar el principio o el final de una sección del código Un paralelogramo es empleado para indicar procesos de entrada o salida Un diamante indica un punto de decisión Los cálculos se encuentran en un rectángulo PROGRAMACIÓN DE MATLAB Ejemplo j p Inicio Definir un vector de xx- valores Encontrar el índice de los números en la matriz x, x para valores mayores a 9. Use el índice de los números para obtener los valores de la matriz x. Crear una tabla de salida usando disp o fprint fprint.. fin Operadores Relacional Lógicos Funciones Las functions se caracterizan por admitir argumentos de entrada y salida y por disponer de su propio espacio de trabajo Las funciones son rutinas de programa programa, implementadas en M-files La primera línea de un fichero llamado *.m que define una función tiene la forma: function [lista de valores de retorno] = name(lista de argumentos) p p por comas van los valores de retorno ((siempre p Entre corchetes y separados que haya más de uno) Entre paréntesis también separados por comas los argumentos. argumentos Puede haber funciones sin valor de retorno y también sin argumentos. Los argumentos son los datos de la función Los valores de retorno sus resultados. Si no hay valores de retorno se omiten los corchetes y el signo igual (=) Funciones Las variables definidas dentro de una función son variables locales locales,, en el sentido de que son inaccesibles desde otras partes del programa y en el de que no interfieren con variables del mismo nombre definidas en otras funciones o partes del programa programa.. Para que la función tenga acceso a variables que no han sido pasadas como argumentos es necesario declarar dichas variables como variables globales, globales, tanto en el programa principal como en las distintas funciones que deben acceder a su valor. valor. Dentro D t de d lla función, f ió llos valores l d retorno de t d b deben ser calculados l l d en algún l ú momento (no hay sentencia return obligatoria, como en C/C++/Java) C/C++/Java).. De todas formas, formas no hace falta calcular siempre todos los posibles valores de retorno de la función, sino sólo los que el usuario espera obtener en la sentencia de llamada a la función. función. En cualquier función existen dos variables definidas de modo automático, llamadas nargin y nargout nargout,, que representan respectivamente el número de argumentos g y el número de valores de retorno con los q que la función ha sido llamada.. llamada Ejemplo de una función Preparar una función sol.m que resuelva el siguiente sistema de ecuaciones: 5x + 2ry + rz = 2 3x + 6y + (2r - 1)z = 3 2x + (r - 1)y + 3rz = 5 para un valor arbitrario del parámetro r que introduciremos antes de ejecutar el programa, de esta forma: >> r=10; 10 A A=[5 [5 2 1 1;6 6 6 1;2 1 2 1 3]; 3] b=[2,3,5]; b [2 3 5] >> X=sol(r,A); % programa para resolver una matriz function [x]=sol(r,b,A) AA(1 2)=A(1 2)*r; AA(1,2)=A(1,2) r; AA(1,3)=A(1,3) AA(1 3)=A(1 3)*r; r; AA(2,3)=A(2,3) AA(2 3)=A(2 3)*(2*r (2 r-1); 1); AA(3,2)=A(3,2)*(r-1); AA(3,3)=A(3,3)*r; x=A\b’; Partes básicas de un mm-file Para una simple p función se p presenta las p partes básicas de un m-file Note que cuando en una línea se emplea el carácter %, esta no es ejecutable (este carácter indica comentario) En la versión 2006ª de MATLAB, se puede ejecutar un archivo m-file, por partes, esto es creando celdas dentro del archivo. Para ello se utilizan el carácter % dos veces en una línea %% %%. Este se emplea cada que se crea una celda. (deben aparecer solo l %% en una sola l lílínea, sin i texto, t t de d lo l contrario t i se considera id como comentario) Bloque de comentarios. comentarios Para escribir un bloque de comentarios que requiere de más de una línea, se usa el operador %{ y %}. Partes básicas function f = fact(n) % Compute a factorial value. % FACT(N) returns the factorial of N, % usually denoted by N! %% % Put simply, FACT(N) is PROD(1:N). f = prod(1:n); Línea de definición de función Linea de comentario y/o texto (ayuda) Inicio de celda Comentario Cuerpo de la función Ejemplo function [med,des]=med_des(x) % Funciona para calcular la media y la desviación a la vez % [med,des]=med [med,des] med_des(x) des(x) % % curso CIRA (may/2010) med=mean(x(:)); d ( ( )) des=std(x(:)); >> help med_des Funciona para calcular la media y la desviación a la vez [med,des]=med_des(x) curso CIRA (may/2010) Programación Elementos básicos de cualquier programa de una cierta complejidad Bifurcaciones Bucles MATLAB posee un lenguaje de programación que –como cualquier otro lenguaje– dispone de sentencias para realizar bifurcaciones y bucles. Las lenguaje bifurcaciones permiten realizar una u otra operación según se cumpla o no una determinada condición. Bifurcaciones Bucles Los bucles permiten repetir las mismas o análogas operaciones sobre datos distintos. Mientras que en C/C++/Java el "cuerpo" de estas sentencias se determina mediante llaves {{...}, }, en MATLAB se utiliza la p palabra end con análoga finalidad. Control de Declaraciones en un programa El control de declaraciones en MatLab, MatLab, es divido en 4 categorías: 1. Control Condicional; “if, if, switch”. switch”. 2 Control Loop (bucle); “for 2. for,, while while,, continue continue,, break break” 3. Control de error; “try, catch” 4. Terminación del programa; “return” return” Condicional de control; “if, if, switch Este grupo de instrucciones de control, permite seleccionar en tiempo de ejecución cuál bloque del código es ejecutado. La selección de esta acción, esta en función de si una condición es verdadera o falsa. Para ello se utiliza la sentencia if (el cual puede incluir else o elseif elseif)). Para seleccionar un número de opciones posibles, en función del valor de una expresión, utilice como opción las declaraciones swhtch y case (que puede incluir lo contrario). Sentencia if if,, else, else, y elseif en MATLAB if evalúa una expresión lógica, y ejecuta un grupo de declaraciones basadas en el valor de la expresión. La sintaxis es muy simple, if se escribe en la forma siguiente:: siguiente bifurcación simple if condicion (expresión lógica) sentencias ((declaraciones)) end Existe también la bifurcación múltiple, múltiple, en la que pueden concatenarse tantas condiciones como se desee:: desee if condicion1 bloque1 elseif condicion2 bloque2 else % opción por defecto para cuando no se cumplan las condiciones 1,2 bloque3 end Ejemplo: >> a=5.1; a=5 1; If rem(a,2)==0 disp(‘a disp( disp ((‘a a es par’); par ); b=a/2 end Crear un Script que permita identificar si un número es par o impar. Use la función mod mod(n,2) (n,2) Tarea Siempre se debe verificar si es posible encadenar (anidar), lo que se busca b es simplificar i lifi Sentencia switch switch,, case,, and otherwise La sentencia switch realiza una función análoga a un conjunto de if if... ...elseif elseif concatenados.. Su sintaxis es la siguiente concatenados siguiente:: Switch expresion case value value1 1, bl bloque1 bloque 1 case {case_expr {case_expr2 2, case_expr3 case_expr3, case_expr4 case_expr4,...} ...} bloque2 bloque 2 ... otherwise,, % opción por defecto bloque3 otherwise bloque3 End Al principio se evalúa la expresión expresión,, cuyo resultado debe ser un número escalar o una cadena de caracteres caracteres.. Este resultado se compara con value value1 1 , y se ejecuta el bloque de sentencias que corresponda con ese resultado resultado.. Si ninguno es igual a expresión se ejecutan las sentencias correspondientes a otherwise otherwise.. Según puede verse en el ejemplo anterior, es posible agrupar varias condiciones dentro de unas llaves ((constituyendo y lo q que se llama un cell array y o vector de celdas) celdas); ); basta la igualdad g con cualquier elemento del cell array para que se ejecute ese bloque de sentencias sentencias.. La “igualdad” debe entenderse en el sentido del operador de igualdad (==) para escalares y la función strcmp strcmp() () para cadenas de caracteres) caracteres).. Sentencias de repetición 1. Las sentencias de repetición 2. Sentencias de repetición controladas por contador 3. Sentencias de repetición controladas por una expresión lógica • Se utilizan para ejecutar una misma actividad repetidas veces. • Las sentencias que se realizan en cada repetición (o iteración) son las mismas, y lo que puede variar en cada iteración son los datos. • La repetición de un bloque de sentencias un determinado número de veces también se denomina bucle. Las sentencias de repetición Sentencia for La sentencia for de MATLAB es muyy diferente y no tiene la generalidad de la g sentencia for de C/C++/Java. La siguiente construcción ejecuta sentencias con valores de i de 1 a n, variando de uno en uno. for i=1:n sentencias end o bien, for i= i=vectorValores vectorValores sentencias end donde vectorValores es un vector con los distintos valores para i. for i=n:i=n:-0.2:1 sentencias t i end dos anidados d bucles b l anidados. id d . for i=1:m for j=1:n sentencias end end Una última forma de interés del bucle for es la siguiente (A es una matriz): for i=A sentencias end en la que la variable i es un vector que va tomando en cada iteración el q valor de una de las columnas de A. Número de apariciones de una letra en una frase % N = NumLetras(CADENA, NumLetras(CADENA LETRA) % Numero de apariciones de una letra en una cadena % CADENA: Cadena a explorar % LETRA : L Letra t buscada b d function n = NumLetras(cadena, letra) n = 0; for l = cadena if l == letra n = n + 1;; end end Obsérvese que se puede realizar matricialmente de forma más compacta: p ffunction ti n = NumLetras(cadena, N L t ( d letra) n = sum(cadena == letra); Sentencias de repetición controladas por una p lógica: g expresión WHILE condición % La paga pvp entrada = 6; % El cine cuesta 6 pesos pvp_entrada disponible = 0; % Somos muy pobres while disponible < pvp_entrada recibido = input('Papá, dame dinero: '); disponible = disponible + recibido; end disp('Gracias por los'); disp(disponible); p( p ); % FOR con contador for i = 1:100 suma = suma + i; % O cualquier otra operación end % % WHILE equivalente i = 1; while i <= 100 suma = suma + i % O cualquier otra operación i=i+1 end WHILE – Prevención de errores comunes Es preciso asegurarse de que las variables de las expresiones que definen el vector están inicializadas antes de evaluarlas e a ua as po por p primera e a vez. e ●Delimitar siempre el cuerpo del bucle con while ... End ●Utilizar el sangrado para reconocer fácilmente el conjunto de instrucciones que pertenecen al bucle ●En la secuencia de instrucciones debe modificarse alguna g variable que forme parte de ExprLog para que alguna vez se evalúe a verdadero, y evitar la ejecución infinita del bucle. ●Evitar bucles infinitos es una responsabilidad exclusiva del programador. programador Sentencia while La estructura del bucle while es muyy similar a la de C/C++/Java. Su sintaxis es la siguiente: while condicion sentencias end donde condicion puede ser una expresión vectorial o matricial. Las sentencias se siguen ejecutando mientras haya elementos distintos de cero en condición condición,, es decir, mientras haya algún o algunos elementos true true.. El bucle se termina cuando todos los elementos de condición son false (es decir, cero). SENTENCIA break Al igual que en C/C++/Java, la sentencia break hace que se termine la ejecución del bucle for y/o while más interno de los que comprenden a dicha sentencia. SENTENCIA continue La sentencia continue hace que se pase inmediatamente a la siguiente iteración d lb del bucle l for f o while while, hil , saltando lt d ttodas d llas sentencias t i que h hay entre t continue ti y ell fi fin del bucle en la iteración actual. actual.while while más interno de los que comprenden a dicha sentencia. EJEMPLOS for i=1:5 A(i,1)=1; A(1,i)=1; end Para salir del bucle se utiliza break for k=1:100 x=sqrt x= sqrt(k); (k); if((k>10)&(x if ((k>10)&(x--floor floor(x)==0)) (x)==0)) break end end k for i=2:5 for j=2:5 A(i,j A( i,j)=A(i,j )=A(i,j--1)+A(i1)+A(i-1,j); end end A Mostrar una línea de texto utilizando while y disp n=10; k=0; while hil k<=n k x=k/3; disp disp([x p([ ([x x^2 x^3]) ]) k=k+1; pause end Tarea: Calcular el factorial de un número (n). Considere los casos particulares para el 0 y el 1. Y el caso de entrada inválida, n<0 El cálculo del factorial. Observe como se capturan los casos particulares para el 0 y el 1. Y el caso de entrada inválida, n<0. % retorna t ell ffactorial t i ld dell número ú d dado d function [ ] = factorial(n); if n < 0 disp('Ingrese un número positivo !') return; end; if n==0 | n==1 disp('El factorial de '); disp(n); disp('es 1'); return; end; mult = 1; f i=1 for 1:n; mult = mult * i; end; Lectura y escritura interactiva de variables Una forma sencilla de leer variables desde teclado y escribir mensajes en la pantalla del PC es utilizando la función input y disp. FUNCIÓN INPUT La función input permite imprimir un mensaje en la línea de comandos de MATLAB y recuperar como valor de retorno un valor numérico o el resultado de una expresión tecleada por el usuario usuario.. >> n = input('Teclee el número de ecuaciones') Otra posible forma de esta función es la siguiente (obsérvese el parámetro 's 's'): '): >> nombre = input('¿Cómo te llamas?','s') llamas?','s') FUNCIÓN DISP La función disp permite imprimir en pantalla un mensaje de texto o el valor de una matriz, pero sin imprimir su nombre. >> disp disp('El disp( (('El El programa ha terminado terminado')) >> A=rand(4,4) >> disp(A) disp(A) Entrada y salida de datos Ya se ha visto una forma de realizar la entrada interactiva de datos por medio de lla función f ió input i t y de d imprimir i i i resultados lt d por medio di de d lla función f ió disp di . Ahora disp. Ah se van a ver otras formas de intercambiar datos con otras aplicaciones aplicaciones.. IMPORTAR DATOS DE OTRAS APLICACIONES Hay varias formas de pasar datos de otras aplicaciones –por ejemplo de Excel Excel– –a MATLAB Se pueden enumerar las siguientes: MATLAB. siguientes: Se puede utilizar Copy y Paste para copiar datos de la aplicación original y depositarlos entre los corchetes de una matriz o vector, en una línea de comandos de MATLAB. Se puede crear un fichero *.m con un editor de textos, con lo cual no existen problemas de edición. Es posible leer un flat file escrito con caracteres ASCII. Un flat file es un fichero con filas de longitud constante separadas con Intro Intro,, y varios datos por fila separados por blancos (espacios). (espacios). MATLAB llee este t tipo ti d ficheros de fi h con ell comando d load. l d. Si se ejecuta load j t load l d datos.txt el contenido del flat file se deposita en una matriz con el nombre datos. datos.. Por ejemplo, creando un fichero llamado flat datos flat..txt que contenga las líneas: líneas: >> 23. 23.456 56 56..032 67 67..802 3.749 -98. 98.906 34 34..910 El comando A=load('flat A=load('flat..txt') leerá estos valores y los asignará a la matriz A. Para más información utilizar help load load.. El comando textread permite leer datos de cualquier tipo de un fichero siempre que estén convenientemente separados separados.. Ver el Help para más información información.. – Se pueden leer datos de un fichero con las funciones fopen y fread – Existen también otros métodos posibles posibles:: escribir funciones en C para traducir a formato *.mat (y cargar g después p con load load), ), crear un fichero ejecutable *.mex que lea los datos, etc etc.. Por ejemplo, creando un fichero llamado flat.txt que contenga las líneas: 23.456 56.032 67.802 3.749 -98.906 34.910 El comando A=load('flat.txt') leerá estos valores y los asignará a la matriz A. Para más información utilizar help load. load. El comando textread permite leer datos de cualquier tipo de un fichero siempre que estén convenientemente separados.– separados.–se pueden leer datos de un fichero con las l ffunciones i f fopen y fread f d El comando imread imread,, lee una imagen g desde un archivo g grafico Sintaxis A = imread( imread(filename,fmt filename,fmt)) El comando imwrite imwrite,, escribe una imagen en un archivo grafico Sintaxis imwrite imwrite((A,filename,fmt) A filename fmt) A,filename,fmt fmt) El comando xlsread xlsread,, lee una archivo creado en Excel (archivo .xls .xls)) Sintaxis num = xlsread('filename', xlsread('filename', sheet, 'range') El comando xlswrite xlswrite,, graba una matriz en un archivo de Excel (archivo .xls .xls)) Sintaxis xlswrite xlswrite('filename', ('filename', M, sheet, 'range') Ejemplos para crear programas Crear un programa que permita resolver un sistema de ecuaciones Ax=b, Ax =b, por el método iterativo de Jacobi x x ( k 1) i ( k 1) i n 1 k b j aij x i aii i 1 i j bi ai1 x1k ...... aii1 xik1 aii1 xik1 ... ain x nk aii Crear un programa que permita resolver una integral utilizando la regla g del trapecio p compuesta p b a M 1 h f ( x)dx f (a ) f (b) f ( x k ) 2 k 1 x k a kh b a h M 4 x e 2 0 x dx function X=jacobi(A,B,P,delta, max1) % Input - A matriz no singular N x N % - B matriz de N x 1 % - P matriz N x 1 valores iniciales % - delta es la tolerancia de P % - max1 numero máximo de iteraciones % Output - X es una matriz N x 1 la aproximación de la solución AX = B N = length(B); for k=1:max1 for j=1:N j X(j)=(B(j)-A(j,[1:j-1,j+1:N])*P([1:j-1,j+1:N]))/A(j,j); end err=abs(norm(X'-P)); ( ( )); relerr=err/(norm(X)+eps); P=X'; if (err (err<delta)|(relerr<delta) delta)|(relerr delta) break end end X=X'; 5x y z 5 x 4y z 4 x y 3z 3 A=[5 A [5 1 1; 1 1 4 1; 1 1 1 3] 3], b=[5 4 3]’ x=A\b resto=A x=A\b, resto=A*x-b x-b function s=traprl(f,a,b,M) %Input - f es la funcion a integrar como cadena de caracteres, 'f' % - a y b son los limites superior e inferior de integracion % - M es el numero de subintervalos %Output - s es la suma trapezoidal h=(b-a)/M; s 0; s=0; for k=1:(M-1) x=a+h*k; s=s+feval(f,x); end s=h*(feval(f,a)+feval(f,b))/2+h*s; >> fh = @(x) @( ) x^4*exp(-x) ^4* ( ) fh = @(x) x^4*exp(-x) x 4 exp(-x) <<traprl(fh,0,4,10) p ( ) ans = 8.9079 <<traprl(@(x) x^4*exp(-x),0,4,10) ans = 8.9079 CREACIÓN DE REFERENCIAS DE FUNCIÓN ((function function handles handles)) Las referencias de función son un nuevo tipo de datos de MATLAB. Una referencia de función se puede crear de dos formas diferentes: Mediante el operador @ ("at" o "arroba") "arroba") La referencia a la función se crea precediendo el nombre de la función por el operador @. El resultado puede asignarse a una variable o pasarse como argumento a una función. función Ejemplos: fh = @sin; quad(@sin, quad (@sin,, 0,, pi); (@ pi p ); area = q 2. Mediante la función str2func La función str2func recibe como argumento una cadena de caracteres conteniendo el nombre de una función y devuelve como valor de retorno la referencia de función. Una de las ventajas j de esta función es que puede realizar la conversión de un vector de celdas con los nombres en un vector de referencias de función. Ejemplos: >> fh = str2func( str2func('sin'); sin ); >> str2func({' str2func({'sin','cos','tan sin','cos','tan'}) '}) @sin @cos @cos @tan ans = @sin Recomendaciones generales de programación Las funciones vectoriales de MATLAB son mucho más rápidas que sus contrapartidas escalares. En la medida de lo posible es muy interesante vectorizar los algoritmos de cálculo, es decir, realizarlos con vectores y matrices, y no con variables escalares dentro de bucles. Aunque los vectores y matrices pueden ir creciendo a medida que se necesita, es mucho más rápido reservarles toda la memoria necesaria al comienzo del programa. Se puede utilizar para ello la función zeros. Además de este modo la memoria reservada es contigua. Es importante utilizar el profile para conocer en qué sentencias de cada función se gasta la mayor parte del tiempo de cálculo. De esta forma se descubren “cuellos de botella” y se pueden desarrollar aplicaciones mucho más eficientes. Conviene desarrollar los programas incrementalmente, comprobando cada función o componente que se añade. De esta forma siempre se construye sobre algo que ya h sido ha id comprobado b d y que funciona. f i Si aparece algún error, lo más probable es que se deba a lo último que se ha añadido y de esta manera la búsqueda de errores está acotada y es mucho más añadido, sencilla. Recuérdese que el tiempo ordinario de corrección de errores en un programa puede ser 4 ó 5 veces superior al tiempo de programación. El debugger es una herramienta muy útil a la hora de acortar ese tiempo de puesta a p p punto. En este mismo sentido, p puede decirse q que p pensar bien las cosas al programar (sobre una hoja de papel en blanco, mejor que sobre la pantalla del PC) siempre es rentable, porque se disminuye más que proporcionalmente el tiempo de depuración y eliminación de errores. Otro objetivo de la programación debe ser mantener el código lo más sencillo y ordenado posible. Al pensar en cómo hacer un programa o en cómo realizar determinada tarea es conveniente pensar siempre primero en la solución más sencilla, y luego plantearse otras t cuestiones ti como la l eficiencia. fi i i Finalmente, el código debe ser escrito de una manera clara y ordenada, introduciendo comentarios, comentarios utilizando líneas en blanco para separar las distintas partes del programa, sangrando las líneas para ver claramente el rango de las bifurcaciones y bucles, utilizando nombres de variables que recuerden al significado de la magnitud física correspondientes, correspondientes etc. etc En cualquier caso, la mejor forma (y la única) de aprender a programar es programando. programando Argumentos de una función • • Checar el número de argumentos de entrada • Pasar un número variable de argumentos • Checar el número de argumentos de salida Número de argumentos de entrada y salida nargin y nargout indican cuántos argumentos de entrada o salida, respectivamente, ha utilizado un usuario. • Ejemplo • Ejemplo testarg1(a,b) function [x0, y0] = testarg2(x, y, npts, npts, angle, angle, subdiv) subdiv) • Pasar un número variable de argumentos varargin indica una lista de argumentos de entrada variable varargout indica una lista de argumentos de salida variable function y = bar(varargin) La función acepta un numero variable de argumentos de entrada function myplot myplot((x,varargin) x,varargin) plot((x,varargin plot x,varargin{:}) {:}) function varargout = foo(n) La función indica que se pude obtener un numero variable de argumentos de salida function [s,varargout]= s,varargout]=tamano tamano(x) (x) nout = max max(nargout,1) (nargout,1)--1 s = size size(x); (x); for k=1:nout, varargout varargout(k) (k) = {s(k)}; end Lectura y escritura de ficheros MATLAB dispone de funciones de lectura/escritura análogas a las del lenguaje C (en ( l las que están tá inspiradas), i i d ) aunque con algunas l dif diferencias. diferencias i . En E generall son versiones simplificadas –con menos opciones y posibilidades posibilidades– – que las correspondientes funciones de C FUNCIONES FOPEN Y FCLOSE Estas funciones sirven para abrir y cerrar ficheros, respectivamente. La función fopen tiene la forma siguiente (sintaxis): [fi,texto] fi,texto] = fopen fopen(' ('filename','c filename','c') ') donde fi, es un valor de retorno que sirve como identificador del fichero texto, es un mensaje para caso de que se produzca un error, y c, es un carácter á t (o ( dos) d ) que iindica di ell ti tipo d de operación ió que se d desea realizar. Las opciones más importantes son las siguientes: 'r' 'w' 'a' 'r+' r+ lectura (de read) escritura reemplazando (de write) escritura a continuación (de append) lectura y escritura Cuando por alguna razón el fichero no puede ser abierto, se devuelve un (-1). En puede proporcionar p p información sobre el este caso el valor de retorno texto p tipo de error que se ha producido (también existe una función llamada ferror que permite obtener información sobre los errores. Después de realizar las operaciones de lectura y escritura deseadas, el fichero se puede cerrar con la función close en la forma siguiente (sintaxis): st = fclose f fclose(fi) (f ) donde st es un valor de retorno para posibles condiciones de error. Si se quieren cerrar todos los ficheros abiertos a la vez puede utilizar el comando: st = close( close('all') all ) Lectura y escritura de ficheros Cuando MATLAB lee un archivo especifico, se intenta hacer coincidir los datos en el archivo de la cadena del formato. formato Si se produce una coincidencia, coincidencia los datos se escriben en la matriz del orden de las columnas del archivo. Si se produce una coincidencia parcial, sólo los datos que corresponden se escriben en la matriz, y se detiene la operación de lectura. La cadena de formato consiste en caracteres ordinarios y/o especificaciones de conversión. Las especificaciones p de conversión indican el tipo p de datos y cotejarlos implica el uso del carácter %, y de forma opcional el ancho del campo seguido la conversión de los caracteres. Las especificaciones de conversión comienzan con el carácter% y contienen estos elementos opcionales y requeridos: • • • • Banderas (Flags,opcional) A h y campos d Ancho de precisión i ió (opcional) Un especificador de subtipo ( (opcional) i l) La conversión de caracteres (requerido) FORMATO La cadena (string) entre comillas simples que describe el formato de los campos de salida. Puede incluir las combinaciones siguientes: 1.-- Signo de porcentaje, 1 porcentaje seguido de una conversión de caracteres caracteres, tales como '% % s' s para las cadenas. 2-.. Operadores que describen el ancho de campo, precisión, y otras opciones. 2 3.- El texto (variable) para impresión. 4.- caracteres, incluyendo: '' Single quotation mark %% Percent character \\ Backslash \a Alarm \b Backspace \f Form feed \n New line \r Carriage return \t Horizontal tab \v Vertical tab \xN Hexadecimal number, N \N Octal number, N En la tabla siguiente se muestran los caracteres de conversión disponibles y subtipos. Value Type yp Integer, signed Integer unsigned Integer, Conversion %d or %i %ld or %li %hd or %hi %u %o %x %X %lu %lo %lx or %lX %hu %ho %hx or %hX Floating-point number %f %e %E %g %G %b or %bX %bx %bo %bu %tx or %tX %to %tu Characters %c %s Details Base 10 values 64-bit base 10 values 16-bit base 10 values Base 10 Base 8 (octal) Base 16 (hexadecimal), lowercase letters a–f pp letters A–F Same as %x, uppercase 64-bit values, base 10, 8, or 16 16-bit 16 bit values, base 10, 8, or 16 Fixed-point notation Exponential notation notation, such as 3 3.141593e+00 141593e+00 Same as %e, but uppercase, such as 3.141593E+00 The more compact of %e or %f, with no trailing zeros The more compact of %E or %f, with no trailing zeros D bl Double-precision i i h hexadecimal, d i l octal, t l or d decimal i l value l Example: %bx prints pi as 400921fb54442d18 Single-precision hexadecimal, octal, or decimal value Example: %tx prints pi as 40490fdb Single character String of characters Flags Action Flag Example Left-justify Left justify. '–' %-5 % 5.2f 2f Print sign character (+ or –). '+' %+5.2f Insert a space before the value. '' % 5.2f Pad with zeros. '0' %05.2f Modify y selected numeric conversions: oFor %o, %x, or %X, print 0, 0x, or 0X prefix. oFor %f, %e, or %E, print decimal point even when precision is 0. oFor %g or %G, do not remove trailing zeros or decimal point. '#' %#5.0f Identificador Orden del procesamiento de las entradas. Utilice la sintaxis $ n, n donde n representa la posición del valor en la lista de entrada. Por ejemplo '%3$s %2$s %1$s %2$s' imprime las entradas 'A', 'B', 'C' de la forma: C B A B. Limitaciones de las conversiones: 1.- En conversiones numéricas imprime sólo el componente real de los números complejos. 2.- Si solicita un número entero o una cadena de conversión a un valor numérico que contiene una fracción, f MATLAB anula la conversión especificada f y utiliza% % e. 3.- Si solicita una conversión de cadenas (% s) en valores enteros, MATLAB: a) Emite una advertencia. b) Convierte los valores que corresponden a los códigos de carácter válido a los caracteres. Por ejemplo, '% s' convierte [65 66 67] de ABC. 4.- Diferentes plataformas de visualización de notación exponencial (como% e) con un número diferente de dígitos en el exponente. FUNCIONES FSCANF FSCANF,, SSCANF SSCANF,, FPRINTF Y SPRINTF Estas funciones permiten leer y escribir en ficheros ASCII, es decir, en ficheros formateados. La forma general (sintaxis)de la función fscanf es la siguiente: i i t [var1,var2,...] = fscanf fscanf((fi,'cadena de control',size) control',size) donde fi size es el identificador del fichero (devuelto por la función f fopen), ) es un argumento opcional que puede indicar el tamaño del vector o matriz a leer. cadena de control va encerrada entre apóstrofos simples, y contiene los especificadores de formato para las variables: %s %d %f %lf para cadenas de caracteres para variables enteras para variables de punto flotante para variables de doble precisión La función sscanf es similar a fscanf pero la entrada de caracteres no proviene de un fichero sino de una cadena de caracteres. La función fprintf dirige su salida formateada hacia el fichero indicado por el identificador. S sintaxis Su i t i es: fprintf(fi,'cadena de control',var1,var2,...) Ésta es la función más parecida a su homóloga de C. La cadena de control contiene los formatos de escritura, que son similares a los de C, como muestran los ejemplos siguientes: fprintf(fi,'El número de ecuaciones es: %d\n',n) fprintf(fi 'El fprintf(fi, El determinante es: %lf10.4\n %lf10 4\n',n) n) De forma análoga, la función sprintf convierte su resultado en una cadena de caracteres que devuelve como valor de retorno, en vez de enviarlo a un fichero. Ejemplo: resultado = sprintf('El cuadrado de %f es %12.4f\n',n,n* ) donde resultado es una cadena de caracteres. Esta función constituye el método más general de convertir números en cadenas de caracteres, por ejemplo para ponerlos como títulos de figuras. Ejemplo Agua en un canal (alcantarilla) Determinar la cantidad de agua que fluirá a través de una alcantarilla, situación que no es fácil de primera instancia, dado que, el canal puede ser de forma no uniforme , el flujo ser influenciado por obstrucciones, obstrucciones la fricción es un factor importante, etc. Un enfoque numérico nos permite considerar todos esos factores, desarrollando un modelo que permita simular el comportamiento real del agua. agua Considere el siguiente grupo de datos (altura de agua contra flujo, gasto) de una alcantarilla de sección transversal definida Altura (ft) Flujo (ft3/s) 0 1.7 1.95 2.6 2.92 4.04 5.24 0 2.6 3.6 4.03 6.45 11.22 30.61 1.- Calcule el mejor ajuste lineal, 1 lineal cuadrático y cubico, cubico obteniendo la ecuación de ajuste y la grafica de cada una de ellas en una sola figura. Indicando en el grafico, los datos que representa el modelo en el siguiente orden, lineal en primer término, después cuadrático y finalmente la cubica. Solución 1.- Planteamiento del problema Realizar una regresión polinomial, graficar los resultados y determinara el orden de la representación de los datos. 2.- Describir las entradas y salidas Entrada: Datos de altura y flujo Salida: Gráfica de resultados 3 - Desarrollar a mano el ejemplo (esbozo de la solución) 3. 4.- Utilizar MATLAB para obtener la solución 4.- Utilizar MATLAB para obtener la solución INTERFAZ GRÁFICA DE USUARIO EN MATLAB (GUIDE) GUIDE es un entorno de programación visual disponible en MATLAB para realizar y ejecutar programas que necesiten ingreso continuo de datos. datos. Tiene las características básicas de todos los programas visuales como Visual Basic o Visual C++ C++.. INICIO Para iniciar un proyecto, se puede realizar de dos maneras: • Ejecutando la siguiente instrucción en la ventana de comandos: >> guide • Haciendo un click en el ícono que muestra la figura: Icono Guide Ventana de inicio Opciones de la ventana de inicio a) Blank GUI (Default) La opción de interfaz gráfica de usuario en blanco (viene predeterminada), presenta un formulario nuevo, el cual se utiliza par diseñar un programa. b) GUI with Uicontrols Esta opción presenta un ejemplo en el cual se calcula la masa, dada la densidad y el volumen, en alguno de los dos sistemas de unidades.. Se puede ejecutar este unidades ejemplo y obtener resultados resultados.. c) GUI with Axes and Menu Esta opción p es otro ejemplo j p el cual contiene el menú File con las opciones Open, Print y Close Close.. En el formulario tiene un Popup menu, menu, un push button y un objeto Axes Axes,, se pude ejecutar el programa eligiendo alguna de las seis opciones que se encuentran en el menú despegable y haciendo click en el botón de comando comando.. d) Modal Question Dialog Con esta opción se muestra en la pantalla un cuadro de diálogo común, el cual consta de una pequeña imagen, una etiqueta y dos botones Yes y No, dependiendo del botón que se presione, el GUI retorna el texto seleccionado (la cadena de caracteres ‘Yes’ o ‘No’). ‘No’). Interfaz gráfica de usuario en blanco Blank GUI Herramientas de la interfaz gráfica Alinear objetos. objetos Editor de menú. Paleta de componentes Editor de orden de etiqueta. Editor del MM-file. file. ÁREA DE TRABAJO P Propiedades i d d de d objetos. N Navegador d d de objetos. bj t j Grabar y ejecutar (ctrl ctrl.. + T). Etiqueta de cada elemento de la paleta de componentes File >> Preferences Descripción de los componentes Control Valor de estilo Descripción Check box ‘checkbox’ checkbox Indica el estado de una opción o atributo Editable Text ‘edit’ Caja para editar texto Pop-up menu ‘popupmenu’ Provee una lista de opciones List Box ‘listbox’ Muestra una lista deslizable Push Button ‘pushbutton’ Invoca un evento inmediatamente Radio Button ‘radio’ Indica una opción que puede ser seleccionada Toggle gg Button ‘togglebutton’ gg Solo dos estados , “on” o “off” Slider ‘slider’ Usado para representar un rango de valores St ti Text Static T t ‘t t’ ‘text’ M Muestra t un string t i de d ttexto t en una caja j Panel button Agrupa botones como un grupo Button Group Permite exclusividad de selección con los radio button PROPIEDADES DE LOS COMPONENTES Cada uno de los elementos de GUI, tiene un conjunto de opciones y se accede a ellas con click derecho. View Callbacks Una de las opciones de un elemento del área de diseño más importantes que se accede con click derecho es View Callbacks, Callbacks, la cual, al ejecutarla, abre el archivo .m asociado al diseño y nos posiciona en la parte del programa que corresponde a la subrutina que se ejecutará cuando se realice una determinada acción sobre el elemento que se esta editando editando.. Por ejemplo, al ejecutar View Callbacks>>Callbacks en el Push Button, nos ubicaremos en la parte del programa: % --- Executes on button press in pushbutton2. function pushbutton2_Callback(hObject, pushbutton2 Callback(hObject eventdata, eventdata handles) % hObject handle to pushbutton2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) FUNCIONAMIENTO DE UNA APLICACIÓN GUI Una aplicación GUIDE consta de dos archivos: archivos: .m y .fig. .fig. El archivo .m es el que contiene el código con las correspondencias de los botones de control de la interfaz. El archivo hi .fig fi contiene ti los l elementos l t gráficos. áfi Cada vez que se adicione un nuevo elemento en la interfaz gráfica, se genera automáticamente código en el archivo .m. .m m. Para ejecutar una Interfaz Gráfica, si se ha etiquetado con el nombre curso fig simplemente se ejecuta en la ventana de comandos curso.fig, >> curso %nombre de la interfaz gráfica O desde el achivo m-file haciendo click derecho y seleccionando la opción RUN RUN.. MANEJO DE DATOS ENTRE LOS ELEMENTOS DE LA APLICACIÓN Y EL ARCHIVO .M Todos los valores de las propiedades de los elementos (color, valor, posición, string…) y los valores de las variables transitorias del programa se almacenan en una estructura, est uctu a, los os cuales cua es son so accedidos acced dos mediante ed a te un u único ú co y mismo s o identificador de t cado pa para a todos éstos. Tomando el programa listado anteriormente, el identificador se asigna en: handles.output p = hObject; j ; handles, es nuestro identificador a los datos de la aplicación. Esta definición de identificador es salvada con la siguiente g instrucción: guidata(hObject, handles); guidata, es la sentencia para salvar los datos de la aplicación. Nota: guidata es la función que guarda las variables y propiedades de los elementos en la estructura de datos de la aplicación, por lo tanto, como regla general, en cada subrutina se debe escribir en la última línea. Esta sentencia nos garantiza que cualquier cambio o asignación ó de propiedades o variables quede almacenado. Por ejemplo Si dentro de una subrutina una operación dio como resultado una variable diego para poder utilizarla desde el programa u otra subrutina debemos salvarla de la siguiente manera: handles.diego=diego; guidata(hObject,handles); La primera L i lílínea crea la l variable i bl di diego a lla estructura t t d de d datos t d de lla aplicación li ió apuntada por handles y la segunda graba el valor. SENTENCIAS GET Y SET La asignación u obtención de valores de los componentes se realiza mediante las sentencias get y set. Por ejemplo si queremos que la variable utpl tenga el valor del Slider escribimos: utpl= get(handles.slider1,'Value'); Notar que siempre se obtienen los datos a través de los identificadores handles. g el valor a la variable utpl p al statictext etiquetada q como text1 se Para asignar escribe: set(handles.text1,'String',utpl); %Escribe el valor del Slider en static-text PROGRAMA SUMADORA Con este ejemplo, se muestra el uso de pushbutton, static text y Edit text. Primero, ejecutamos j >> guide en la ventana de comandos, y presionamos Enter. Seleccionamos Blank GUI (default) y presionamos OK. Insertamos los componentes que muestra la siguiente figura: