Вы находитесь на странице: 1из 33
Programacién en Matlab OE seen. PABLO LLANO GONZALEZ INDICE a Matlab. Capitulo I: Introdu Capitulo II: Ficheros-M. Scripts y Funciones Capitulo III: Control de Flujo Capitulo IV: Entrada-Salida de datos 15 18 23 Introduccién a Matlab Capitulo 1 Capitulo I: Introduceién a Matlab En este primer capitulo vamos a realizar una introduccién a Matlab, para en los siguientes capitulos pasar al objetivo principal de estos apuntes, la programacién en Matlab. Esta primera parte puede ser considerada como la mis importante, puesto que para programar en Matlab s6lo nos hard falta saber como se construye un programa (ficheros-M), los diferentes tipos de control de flujo y como se maneja la entrada-salida de datos. Mateméticas basicas ‘Vamos a introducir las operaciones basicas: suma, resta, multiplicacién, etc Algunas de ellas vienen en el siguiente ejemplo, > 44612 12 » 20341 » tans ans = Como se puede apreciar Matlab almacena el resultado en la variable ans, pudiéndose utilizar como cualquier otra variable para futuras operaciones. ‘También podemos observar que la multiplicacién tiene precedencia sobre la suma. Si la sentencia es demasiado larga, ésta puede continuar en otra linea sin mas que afiadir tres puntos (.. al ‘inalizar cada linea de la sentencia, “Matlab ofrece las siguientes operaciones basicas: en Snes es Een SUMA, atb + 33 3 RESTA, ab - 22 3 MULTIPLICACION, a*b * 305 2 DIVISION, wb Jo\ 2 POTENCIA, * 52 1 Las expresiones son evaluadas de izquierda a derecha. Para alterar el orden se pueden utilizar paréntesis. Cuanto menor es el numero en la precedencia antes se ejecuta la operacién. Formatos numéricos Por defecto Matlab representa Jos mimeros con 4 decimales. Si los digitos significativos estén fuera de este rango, Matlab utiliza notacién cientifica, Para alterar esta forma de representacién disponemos de una serie de comandos En la tabla siguiente el formato va cambiando, pero el valor de la variable es el mismo. Introduccién a Matlab Capitulo 1 ene inns COMENTARIO, format long 35.83333333333334 16 digitos format short e 3.5833e+01 5 digitos mis exponente format long e '35.83333333333334 16 digitos mas exponente format hex 404teaaaaaaaaaab hexadecimal format bank 35:83 2 digitos decimales format + + positive, negativo o cero format rat 2156 aproximacién racional format short 35.8333 4 digitos decimales [Es importante darse cuenta de que Matlab no cambia la representacién intema de un nimero cuando diferentes formatos son escogides; s6lo cambia la representacin del nimero, Variables ‘Como cualquier otro Lenguaje de programacién, Matlab tiene reglas acerca de los nombres de variables, Las variables diferencian mayisculas de minisculas (aase sensitive). Las variables pueden contener hasta 19 caracteres. Mis alld del 19, los caracteres son ignorados. Las variables deben comenzar con una letra, seguido por més letras, digitos 6 underscores, Los caracteres de puntuacién no estén permitidos. Matlab conticne una serie de variables especiales. Estas son las siguientes: VARIABLE Nombre de ta variable por defecto para resultados Valor de Ia constante pi El mimero més pequetio tal que al afiadirle 1 crea un mimero racional mayor que 1 en el ordenador Infinito ‘Noes un mimero ( por ejemplo: 0/ 0) El mimero positivo real mas pequeiio que puede ser usado El mtimero positivo real més grande que puede ser usado Si queremos que e! resultado de una operacién no aparezca en pantalla, tenemos que acabar la sentencia con un punto y coma (; ) Para borrar variables utilizamos la instraccién clear seguido de la variable o variables a borrar. ‘Sino ponemos ninguna variable después de cl ear, se borrardn todas las variables. Your variables are: a ans fruta leer » clear a » who Your variables are: ans fruta leer Introduccién a Matlab Capitulo 1 Con ta instrucci6n who observamos todas las variables que tenemos actualmente en el espacio de trabajo. La instrucci6n whos realiza Ia misma tarea que ho pero afiadiendo cierta informacion adicional como el tamafio de la variable, los bytes que ocupa y sila variable es compleja o real Funciones mateméticas elementales Las funciones matematicas elementales aparecen comentadas en la siguiente tabla, neo abs) ‘Valor absoluto o magnitud de un mimero complejo ‘acos(x) Inversa del coseno acosh(x) Inversa del coseno hiperbélico angle(x) Angulo de un nimero complejo asin(s) Tnversa del seno asinh(x) Inversa del seno hiperbilico atan(a) Inversa de la tangente atan2(x,y) Inversa de la tangente para los 4 cuadrantes atanh(s) Inversa de la tangente hiperbética ceil(s) Redondea hacia més infinito conj(a) Complejo conjugado cos(3) cosh) exp(a) fix(s) floor(x) Redondea hacia menos infinito imag(x) Parte imaginaria de un niimero complejo logts) Logaritmo neperiano logos) Logaritmo de base 10 real(s) Parte real de un mimero complejo rem(x,y) Cociente de la divisién: x/y round(x) Redondea hacia el entero més cercano signs) Retorna el signo del argumento: (1 para positivo, -1 para negativo y 0 para 0) sin() Seno sinh(s) Seno hiperbélico sqrt(s) Caleuta ta raiz cuadrada tans) Tangente tanh(x) Tangente hiperb Nimeros complejos ‘Matlab utiliza tanto i como 3 para notacién compleja. Ala hora de programar habra que tener cuidado con los bucles, ya que, generalmente en programacién, se utilizan como variables del bucle for i y 3. Esto nos puede acarrear problemas a la hora de utilizar ‘mimeros complejos en Matlab. Para evitar estos problemas lo mejor e5 utilizar otras variables como contadores, En el siguiente ejemplo se muestran estos problemas: Introduccién a Matlab Capitulo 1 » a=24ary 2.0000 + 3.00004 » 553 i 3 » be2434y b Como se puede apreciar en el ejemplo si en la tercera sentencia pretendiamos crear un niémero complejo 1 lo hemos conseguido. Al introducir la parte imaginaria en un mimero complejo no hace falta introducir el signo de ‘multiplicaci6n, Sin embargo esto acarrearé problemas si utilizamos variables y nos mostrar un mensaje de error. Esto queda expresado en el siguiente ejemplo: » peras=3; » manzanas=4; » sol=perastmanzanas} 22? Undefined function or variable ‘manzanasj* Evidentemente en este caso si hubiera sido necesario introducir el signo de multiplicaciOn si hubiésemos ‘querido crear un nimero complejo, como en el siguiente caso; erastmanzanas*} » sol=peras+manzanas*i. sol 3.0000 + 4.00003 Como vemos en este caso Ia primera solucién daba un error porque el valor de j era 3, Para hallar la soluci6n correcta uilizamos como unidad imaginaria la 5. Si tanto { como 3, tuvieran un cierto valor, la tinica forma de crear un nimero complejo seria borrando ‘una de las dos variables (clear 1). Arrays La forma de creat un array es la siguiente: Me DR, He Ky ee Ba) OED Hay Har Hay vey Mal Un array se define entre corchetes. Los elementos del array se pueden introducir separéndolos con espacios 0 comas, Para visualizar un elemento de un array no tenemos mas que introducir su indice. El primer indice del array es el 1 Para crear un aray con muchos elementos esté claro que la notacién de arriba puede resultar pesada. En este caso podemos utilizar otras dos formas de introducir los valores: Introduccién a Matlab, Capitulo L 2 ‘valor_inicial : incremento : valor final) inspace(valor_inicial, valor_final, niimero_de_valores} La diferencia entre estas dos expresiones esti en que ev fa primera podemos especificar el incremento entre dos puntos, y en la segunda se especifica el niimero de puntos que se escogen. Si en la primera expresi6n a se especifica, el incremento se asume que es 1. Estas dos formas de escoger elementos sirve cuando los elementos se encuentran linealmente espaciados unto de otro. Para el caso especial de separacién logaritmica, Matlab proporciona la funcién Logspace. x=logspace(primer_exponente, Wltimo_exponente, mimero_de_valores) La sintaxis se refiee a: desde 10°*-97=%" a gion noone ‘Vamos a repasar estos conceptos con unos ejemplos. » x=[1, 3, 4, 5] 4 5 408 ° L 2 3 4 5 » xlinspace(0, 5, 6) ° l 2 3 4 5 ‘Logspace(0, 2, 5) 1.0000 3.1623 10.0000 31.6228 100.0000 La funcién Length (a) nos devuelve la longitud del array. ‘Matlab proporciona una serie de operaciones entre artays de fa misma longitud, como son a suma, resta, etc Las operaciones quedan resumidas en la siguiente tabla. Suponemos los vectores a=(a: @ +++ aq] YD=(bi be «++ bal de la misma longitud. [arty aztbs «. asta) forbs aba [2* ay 2* ap — 2* ay] a.*b= (ast; apts ~ a," Divisién entre vectores Elevacién de un vector a un escalar Elevaci6n de un escalar a un vector ‘Hlevacién de un vector a un vector ‘Veamos unos ejemplos de estas operaciones, al 6 b\a= [ay/by ay/by .. ae/Dy) Tay? a2 we 2] [24ay 2423 22a) ab = Ja;%bi a2“b2 - aa*Bal Introduccién a Matlab Capitulo 1 2:5) 12 3 4 5 > be(1:2:9) > 1 3 G9 2 » a.tb Fy 6 15 28 45 > a/b 1.0000 0.6667 0.6000 0.5714 0.5556 > bia 1.0000 0.6667 -0,6000 0.87140. 5556 » air? 1 4 9 16 25 > 24a 2 4 GQ iG a > a.tb 1 8 243 16384 1953125 Para construir un array columna disponemos de des formas: exes er a7 7a] 2. Crear un vector fila y aplicar la operacién ‘ 0 ./ En este segundo caso no hay diferencia entre" y .". La diferencia solo se aprecia en los nimeros ‘complejos. Estas dos operaciones se pueden aplicar tanto a vectores columna como fila, ademés de poder utilizarse en matrices. Laoperacién ‘ calcula el complejo conjugado y lo transpone, Laoperacién .* da como resultado ia transpuesta pero sin conjugar el mimero complejo. Para expresar matrices solo tenemos que combinar la manera de introducir vectores fila y vectores columna, es decir los elementos de una misma fila se separan por espacios (0 comas) y fos de diferentes ccolumnas se separan con punto y coma. Matlab fuerza a que todas las filas contengan el mismo niimero de columnas. > cof] 27 37 4] Hite 1.0000 + 1.00001 2.0000 + 2.00001 3.0000 + 3.00001 4.0000 + 4.00004 Introduccién a Matlab Capitulo y & 1.0000 - 1.00001 2.0000 ~ 2.00004 3.0000 ~ 3.00004 4.0000 - 4.00001 4 1.0000 + 1.00004. 2.0000 + 2.00004 3.0009 + 3.00003 4.9000 + 4.00004 Manipulacién de matrices “Matlab proporciona diferentes formas de insertar, extraer y manipular diversas submatrices de la matriz. principal con el hecho de indicar los subindices. Supongamos que queremos acceder al elemento de fila 2 y de columna 3, y modificarle, En este cas0 harlamos lo siguiente: matriz (2, 3)=5. En el caso de que la fila o Ia columna fueran de dimensién ‘mayor que la de la propia matriz, Matlab procederia a aumentar la dimensién de la matriz para adecuarla al nuevo tamaifo, introduciendo ceros en las columnas y flas donde no habia términos. 12374567789) 1 2 3 4 5 6 7 8 9 > A(3,3)=0 A= 1 2 3 4 5 6 7 8 ° >» Al2,6)=1 AS 1 yes) o ° 4 5 6 0 ° 1 7 8 o 0 o 0 Una de las caracteristicas mas potentes de Matlab es la de poder extraer submatrices y modificarlas > Ae[1 23; 45 6; 7 8 9) AS 1 4 7 > BA(3 a 7 8 9 4 5 6 1 2 3 Introduccién a Matlab Capitulo 1 >» A(3:-1:1,2) 7 8 9 4 5 6 1 2 3 La forma de acceder a las submatrices es 1a de colocar entre paréntesis dos arrays. El primero para las filas y el segundo para las columnas. En el iltimo ejemplo los :, equivalen a mostrar todas las columnas, por e60, el resultado de este caso coincide con el def anterior. Los : significan que se muestren todos los sfementos de columnas 0 filas. Si nos quisigramos referira las columnas 1 y 3 del caso anterior, como no son consecutivas, tendriamos que colocar el nimero de columnas entre corchetes. ‘Vamos a ver una serie de ejemplos de extraccién y manipulacién de submatrices. a3) En el primer caso se construye una matriz a partir de otras 2. Se utiliza la matriz. A y a continuacién se affade una submatriz de la matriz B formada por todas las filas de la matriz.B y las columnas 1 y 3 En el segundo caso lo que se extraen son las filas 1 y 2.y las columns 1 y 3, ¥ se guardan en B. En el caso de B=A(:), se construye la matriz B como un vector columna colocando sus columnas una debajo de otra En el iitimo ejemplo lo que se hace es eliminar la segunda columna, Cuando igualas algo a la matriz vacia (J, esto se borra Introduccién a Matlab Capitulo 1 Matlab solo permite eliminar filas enteras 0 columnas, es decir, no est permitido lo siguiente: A(2,2)=01 Matlab proporciona una serie de funciones muy tities para la manipulacién de matrices. [L,U}tu(A) [QR}=ar(a) ramk(A) deeig(A) IV.D}-eig() ‘lipud(A) ftiptr(A) diag(s) diag(A) find(condicién) size(A) Calcula la factorizacién LU de la matriz.cuadrada A. Cateula lz factorizacién QR de la matriz. A ‘Demuelve el rango de la matriz A Obtiene los eigenvalores de la matriz.cuadrada A como un vector columna Da como resultado los eigenvectores en la matriz V y los eigenvalores como los elementos de la diagonal de la matriz D Intercambia la matriz A de arriba abajo Intereambia Ia matriz A de izquierda a derecha ‘Crea una matriz diagonal con el vector ven la diagonal Extrae Ia diagonal de la matriz. A como una columna Devuelve los indices de los elementos que cumplen Ia condicién. (p.ej [m,n]=find(A>40) encuentra los fndices de los elementos de la matriz A que son mayo res de 40 ). Esta funcién devuelve vectores columna Y busca en las matrices por columnas. Devuelve el tamafio de la matriz. ‘Ademis de estas funciones Matlab proporciona una serie de matrices especiales. zeros (3): Crearia una matriz ellena de ceros de dimensién 3 por 3 zeros (2,3) ; Crearia una matriz ellena de ceros de dimension 2 por 3 ones (2,4): Crearia una matriz rellena de unos de dimensin 2 por 4 eye (3): Crearia la matriz identidad (eyedentity) de dimensién 3 por 3 Polinomios En Matlab un polinomio esta representado por un vector fila con sus coeficientes colocados en orden descendiente. Una caracteristica importante a tener en cuenta, es que, los coeficientes que son cero deben ser incluidos. Las raices de un polinomio se pueden encontrar por medio de la funcién root's (Pp) Pp 1 » roots (p) 11.9974 0.9732 -0.1313 -0.2319 -0.7068 1-12.00 4 6] 12 o 0 =o 6 + 0.842 - 0.84245 10 Introduccién q Matlab, Capitulo 1 Debido a que tanto el polinomio como sus raices son vectores en Matlab, Matlab adopta que los polinomios son vectores fila y las raices son vectores colurmna. ‘Tambign se puede construr un potinomio a través de sus rafces con la expresién poly (x) P 1 2 3 » r=roots (p) re =1.0000 + 1.41424 1.0000 - 1.41424 » m=poly(r) 1.0000 2.0000 3.0000 La multiplicacién polinémica esté soportada por medio de la funcién conv (a,b). La multiplicacion de ‘mds de dos polinomios requiere un uso repetido de conv (a,b) La suma de polinomios se hace a través del signo +. Si dos polinomios a sumar tienen distinto orden, el de orden inferior deberd rellenar con ceros hasta tener el mismo orden que el orden superior. La division se hace a través de la orden deconv(c,b). Esta funcidn retoma los valores de los polinomios y los restos. Para la diferenciacién polinémica Matlab proporciona la funcién polyder (g) ‘También esté permitida la evaluacién de un polinomio por medio de la orden polyval (b,x). La mayoria de estas funciones quedan cesumidas en los siguientes ejemplos. 1234); b=[1 49 16); » c=conv(a,b) 1 (Glr20) ee sO ere See dmresG4) » death a= 2 6 12 20 +(0 0.0 a) 1 6 20 S82 81 6 4 » [qrz]=deconv(c,b) ao 1 2 3 4 80 156 162 96 Representacién grafica ‘Nos vamos a centrar ‘inicamente y muy por encima en las grificas 2D. iy Introduceién a Matlab Para dibujar una gréfica disponemos de la funcién plot. Lasintaxis de plot es la siguiente plot (x,y,S) __ siendo S un string formado por los siguientes valores yellow ‘magenta cyan red green dlue white black weomsoge punto - Circulos signo + S estrella cuadrados ddiamantes triangulo (abajo) teidngulo (arriba) twidngulo (izquierda) ‘tiéngulo (derecha) ‘Pentgonos hhexlgonos PUVA >tanetHo ‘marca-x ~ 0:0.01:1)*pi; in (x) + » plot (x,y) » title('Grafica del Seno’); » ylabel ("Seno"); » xlal » gric bel ("Angulo (radianes) "); don Capitulo 1 sélido punteado guidn-punto guién La funcién plot (x,y) hace la representacién de y frente a x. Un dato a tener en cuenta es que la dimensién de xe y _deben coincidir. Lafuncién title ( ‘texto’ ) afiade un titulo a la grifica La funcién ylabel ( ‘texto’ ) afiade un comentario en el ee y. La funcién xLabel { ‘texto’ ) aflade un comentario en el eje x. La funcién grid on afiade la rejilla a la grafica Asi nuestra funcién quedaria de la siguiente forma. rifica del Seno Seno 1 15 2 Angulo (radianes) 2 Introduccién a Matlab Capitulo 1 (tra funcién que puede ser de mucha ayuda es plotyy (x1, yL, x2, y2) Esta funcién lo que hace ¢s dibujar una gréfica con dos ejes y que tengan diferente escala. x= (020,01:1) *piz cos (x) 7 plotyy (x, y1,x,y2) ¥: » y2=1og10 (x+1)+24sart (1004x) + El resultado es el siguiente: La escala correspondiente a la linea que empieza en 2 es Ia de la izquierda y la de la linea que empieza en -2es lade la derecha. legend(cadenat, cadena2, ..) axis({ xmin xmax ymin ymax }) ‘hold fonjoff] figure(a) at loglog semilogx semilogy polar zoom {onjoft] subplot(m,n,p) Afiade una leyenda a la figura activa. Permite escalado manual. ‘Mantiene Ia grifica para poder afladir otras grificas encima. Crea una pantalla para afladir graficas. La variable H se utiliza para referirnos alas graficas. Limpia la pantalla (igure) de gratficas. Eje xe y logaritmicos. Eje x logaritmico. je y logaritmico. Dibuja una gréfica polar. Hace un zoom en la ventana, Divide la pantalla en ‘m’filas con ‘a? columnas y establece como activa la grifica ‘p’. B Introduccién a Matlab, Capitulo I Ventana de comandos 1La ventana de comandos es la ventana en Ja que arranca Matlab. Cuando tecleamos un comando este se guarda en la historia de Matlab y podemos acceder a estos ‘comandos con las teclas de flecha arriba (*) y flecha abajo (1). Si ademas sabemos porque letra empieza el comando que queremos recuperar, basta con escribir la letra inicial y la flecha arriba o abajo. Si hemos tecleado una instruccién mal en la linea de comandos lo podemos borrar caricter a cardcter con la tecla de backspace o podemos borrar la linea completa con Ctt-U. ‘También se puede cambiar el directorio en el que nos encontramos simplemente con el comando ce, que funciona igual que en DOS. Para saber en que directorio nos encontramos usamos la instruccién pvc (similar ala de UNIX). El comando what lista todos los ficheros de Matlab en el directorio en el que nos eacontramos. La instmccién Lookfor nos permite buscar un patrén en la ayuda, Para buscar un fichero conocido se dispone de la funcidn wh: ch, Esta funcién tz devuelve el directorio en el que se encuentra dicho fichero. Elcomando delete borra un fichero Para saber més de todos estos comandos y de otros podemos recurrir a la ayuda escribiendo help y el comando del que queremos conocer la informacién, Todo lo que tecleamos en ta ventana de comandos se puede grabar en Save Workespace as del menii File, en caso de que queramos recuperatlo en otra ocasién. Como se ha podido apreciar a lo largo de todo este capitulo introductoris, Matlab es una herramicnta ppotentisima. Contiene una gran cantidad de librerias (toolbox) como las de funciones especiales lunciones de Bessel, funciones de error, funciones elipticas etc..), las de procesado de sefial, control, cntrada-salida de datos, financieras, etc. Cada usuario, dependiendo de la rama de estudios a la que pertenezca, le interesard utilizar més una toolbox u otra. Estas son las bases minimas que se ha de tener a la hora de introducirse en la programacién con Matlab. El usuario, en caso de necesidad, siempre podr consultar la ayuda de Matlab o en el mejor de los casos, Podiré construir él mismo las funciones a su medida. 4 Programacién en Matlab Capitulo HE Capitulo TI: Ficheros-M. Scripts y Funciones Matlab es un programa disefiado para resolver cualquier problema matemitico. Contiene dos entornos, ‘una ventana en la que se realizan las operaciones y lamadas a las funciones, y un editor donde programar Jos diversos scripts 0 funciones. Para ejecutar un programa lo tenemos que hacer en la ventana principal. (no se pone la extensién m), El editor nos va a permitir programar al igual que con cualquier otro lenguaje de programacién, Sin embargo, hay que tener en cuenta que existen ciertas diferencias entre un lenguaje de programacién, como C 0 Pascal, y Matlab. La estrategia general en cualquier lenguaje de programacién es la de tener un programa principal que realice Hlamadas a ciertos subprogramas, generalmente lamados funciones. Los programas 0 funciones en ‘Matlab reciben el nombre de ficheros-M (M-files). Las funciones en Matlab, siempre tienen que tener la extensién ‘mn’. En Matlab es como si todos Jos programas fueran principales pudiéndose Hamar entre ellos. Un fichero-M puede Iamarse recursivamente, Esto hace que desde cualquier funcién se pueda Tamar a otra independientemente sies el programa principal o no. Por supuesto, en los lenguajes de programacién no cesté permit. Las funciones en Matlab se definen mediante la palabra reservada function. ‘Una de las caracteristicas de Matlab es que a diferencia de otros lenguajes de programacién, las funciones pueden devolver més de un valor. Ademis, no tce falta declarar las variables, ni siquiera en los argumentos de las funciones ni en las Hamadas a las mismas. Matlab trata a todas sus variables como matrices de nimeros complejos, siendo los méimeros reales un caso particular de nimero complejo Para ilustrar el funcionamiento exponemos el siguiente ejemplo: function hip=h(a,b) 8 8 calcula 1a hipotenusa de un Angulo recto e hip=sqrt (a*2+b"2) ‘Al guardar esta funcién en el disco lo tenemos que hacer con el nomibre de la funcién, en este caso, Io ‘endriamos que guardar como ‘h.m’, y esta es la tinica posibitidad que hay. ‘Como se puede observar las funciones no tienen una instruccién de finalizacion de cédigo. Los comentarios en Matlab se ponen con %. En Matlab, los comentarios a continuacién de la definicién de la funcién se consideran como una ayuda de la funcién, Estos comentarios no son obligatorios. Para obtener ayuda se escribe help el nombre de la funcién. En nuestro caso al escribir help + obtendriamos lo siguiente: » help h calcula la hipotenusa de un Angulo recto En Matlab no es obligatorio la terminacién de las sentencias con *;’, pero si no se hace, obtendriamos. resultados intermedios que no nos interesan. En nuestro ejemplo daria igual ya que solo tenemos una sentencia, Supongamos ahora el sizuiente ejemplo: 1s Programacién en Matlab Capitulo H Function valor=£n (x) ® @ FUNCION ESPECIAL 8 og10(a_2) valoz=sqrt (b)z Al ejecutar la funcién veriamos lo siguiente: 7.3485 44.0908 a2 9440e+003 3.2887 1.8135, Como vemos estos resultados intermedios solo nos hacen lenar la pantalla con datos inservibles. PPara borrar la pantalla de comandos (pantalla principal), se uiliza la instrucci6n c1.. ‘También se puede observar en estas funciones que las variables no es necesario declaratlas. Por iltimo, y quizés lo més importante, decir que al igual que C, Matlab distingue las letras mayiisculas de las minisculas y por tanto las variables madi, Madrid y Madrid serian diferentes. ‘Ademas las variables pueden contener hasta 19 caracteres. La tnica restriccién es que las variables deben comenzar con una letra La sintaxis general de declaracién de una funcién es la siguiente: Function [valorl, valor2, ... ,valorn] = nombre_fun(argl,.-.--,argm) De esta declaracién podemos observar que, como dijimos anteriormente, una funcién puede devolver rmiiltiptes valores. Sin embargo, en el caso que tengamos que pasar muchos parimetros como argumentos o el mimero de resultados sea elevado, puede ser més cémodo definir variables globales. Esto se hace declarando variables con la palabra reservada global. La variable creada se ha de declarar tanto en la funcién que hace la llamada, como en la funcién que es llamada. ‘Como indica el titulo de este capitulo, tenemos dos tipos de ficheros-M. Hasta ahora nos hemos centrado cen las funciones, pero disponemos de otto tipo de ficheros-M llamados ‘scripts’ ‘Cuando estamos en la ventana de comandos y queremos hacer que se ejecuten un cierto niimero clevado de comandos consecutivos es mejor utilizar un fichero-M, porque en caso de equivocarnos a la hora de escribirlo, tendriamos que comenzar de nuevo. Los ‘scripts’ no tienen un encabezamiento identificativo a la hora de implementarlo y no tienen ninguna restriccién del nombre del fichero con el que se quiere guardar, excepto la extensién, que al igual que las 16 Programacién en Matlab Capitulo HE funciones tiene que ser ‘.m’ (de ahi el nombre de ficheros-M). Es decir, los ‘scripts’ se escriben como si estuvigramos en la ventana de comandos, Como ejemplo vamos a ver el siguiente ‘script’, que calcula los mimeros de Fibonacci menores de 1000 y hace una grifica, @ Fichero-M que calcula los nimeros de Fibonacci ls while (£(m) +£(m+1))<1000 £ (m2) = (im) +E (mF) 7 nem; end plot (f) La funcién plot con solo un parémetro como argumento lo que hace es represemtar ese pardmetro, en este caso £, respecto al mimero de elementos, Ambos tipos de ficheros, funciones y ‘scripts’, son ficheros ordinarios ASCII y pueden ser creados utilizando el editor 0 procesador de textos que se elija, La principal diferencia entre una funcién y un script, a parte de la forma de su dectaracién, es que cuando se gjecula un ‘script’, al retornar el control a la ventana de comandos, las variables son accesibles desde la ventana de comandos. Es decir, las variables existirn en el espacio de trabajo. En el caso de funciones, al finalizar la ejecucién de las mismas, las variables que se utilizan en el cédigo no son accesibles desde la ventana de comandos, es decir, no existen en el espacio de trabajo. (O si previamente existian, permanecerén inalteradas). Cuando se llama a una funcién por primera vez durante una sesion Matlab, se compila y se guarda en ‘memoria. Entonces esti disponible para usos subsecuentes sin necesidad de recompilacién. Permanece en ‘memoria mientras dure la sesién, a menos que se tenga poca memoria, en cuyo caso puede ser limpiado autométicamente En general, al introducir un nombre de algo en Matlab (por ejemplo whoops.) , el intérprete sigue los siguientes pasos: Mira si whoopie es una variable. Examina si whoopie es una funcién de Matlab Busca en el directorio actual un fichero llamado whoopie.m. Busca en los directorios especificados por la variable de entomo MATLABPATH un fichero llamado whoopie.m. En los siguientes capitulos nos vamos a centrar en los diversos tipos de control de flujo y en la entrada- salida de datos, 7 Programacién en Matlab Capitulo 1 Capitulo 10: Control de flujo If-else-clseif-end ‘La forma general de la instruccién if es la siguiente: if expresiénl sentencias evaluadas si expresiéni es cierta elseif expresién2 sentencias evaluadas si expresién2 es cierta elseif expresién3 sentencias evaluadas si expresién3 es cierta else sentencias evaluadas si ninguna otra expresién es cierta end Los bloques ¢1 sei fy ¢1se no son necesarios. El funcionamiento de esta instruccién queda reflejado en su sintaxis. No hay limite de bloques elseif, ‘pero si el mimero de estos bloques es grande es mejor una expresién switch. Como se puede observar, y adems es una constante en los comandos de control de flujo, la estructura if finaliza con end. ‘Veamos un ejemplo, > aely » if (as=1) disp("Soy el mejor‘); else disp('También soy el mejor"); end La salida de este pequetio programa sera; Soy el mejor Las expresiones de las estructuras if son expresiones relacionales. En Matlab las expresiones relacionales y los operadores Iogicos aparecen en los siguientes dos cuadros. < Menor que < Menor que 0 igual a > Mayor que > Mayor que o igual a Igual a into de 18 Programacién en Matlab Capitulo IIT Mins Riis y o NO La primera tabla es la de los operadores relacionales y la segunda la de los operadores I6gicos. Bucles For Los bucles for tienen la siguiente sintaxis: for x=array sentencias end Con respecto a los bucles while, los bucles for tienen una caracteristica diferente, y es, que en los bucles for es necesario conocer de antemano el mimero de iteraciones a realizar. Columns 1 through 7 0.3090 0.5878 0.80900, 9511 1.0000 0.9511 0.8090 Columns 8 through 10 0.5878 0.3090 0.0000 Un bucle for no puede ser terminado mediante la modificacién dentro del bucle de la variable utilizada ‘como contador. » for n=I:10 x(n)=sin(n*pi/10); n=10; Columns 1 through 7 0.3090 0.5878 0.8090 «0.9512. 1.0000 0.9511 0.8090 Columns 8 through 10 0.5878 0.3090 00000 Para terminar un lazo for 0 whi Le, se dispone de la instruccién break. En lazos anidados, la sentencia break interrumpe el bucle més interno. 19 Programacién en Matlab Capitulo TH Los bucles for deben ser evitados siempre que haya un array equivalente 0 matriz aproximada que resuelva un problema dado. La razén a esto es que los bucles for son ms Fentos y requieren mas cddigo. Por ejemplo, los casos anteriores se podrian haber hecho de la siguiente forma: > x=1:10; » sin(x*pi/10) Columns 1 through 7 0.3090 0.5878 0.8090 0.9511 1.0000 0.9511 0.8090 Columns 8 through 10 0.5878 0.3090 0.0000 Como vemos el resultado obtenido es el mismo que en los dos ejemplos anteriores. Al igual que con las estructuras i f-e1se-end, los bucles for también pueden ser anidados, Bucles While Los bucles while no tienen un mimero de iteraciones fi, sino que el bucle sigue ejecutndose hasta que Ja condicién deja de cumplirse La forma general de un bucle wii Le es la siguiente: while condicién sentencias end Las sentencias se ejecutan hasta que la condicién sea falsa. En este tipo de bucles hay que tener cuidado porque la condicién tiene cambiar dentro del cuerpo del bucle ya que si no pudiera dar un bucle infinto. > while (x<=10) p(x) =sin(x*pi/10) 7 ext: end »P 58 Columns 1 through 7 0.3090 0.5878 0.8090 0.9511 1.0000 0.9511 0.8090 Columns 8 through 10 0.5878 0.3090 0.0000 ‘Como se puede apreciar el resultado es el mismo queen el caso de los bucles for Switch-Case ‘Esta estructura es una estructura propio de seleccién de una entre varias opciones. El efecto es similar al ‘de varias esructuras if-else-end anidadas. Sin embargo, es més claro el uso de esta estructura ‘cuando las opciones a escoger son varias La estructura es la siguiente: 20 Programacién en Matlab Capitulo it switch switch_expresién case case _expresién, sentencia, ..., sentencia case (case expresién_l, ..., case_expresién_n} sentencia, ..., sentencia otherwise, sentencia, ..., sentencia end Las sentencias del bloque otherwise se ejecutan en caso de que no se haya ejecutado ninguna otra Este bloque puede ser omitido. En el segundo case se apreciaz las Haves, que han de ser uilizadas en caso de que en el bloque case haya mas de una expresién. case {'lineal', 'bilineal'} disp('Lineal') case "cubica' disp('Cabica') otherwise disp(‘Opcién errénea') end Lineal Velocidad y memoria Las operaciones con vectores y matrices en Matlab son mas de un orden de magnitud mas répidas que las ‘operaciones compiladorvintérprete. Esto significa que para obtener la mayor velocidad de ejecucién posible, se deben realizar esfuerzos para vectorizar los algoritmos de los ficheros-M. Siempre que sea posible, los lazos for y while deben ser convertides a operaciones con vectores 0 ‘matrices como hicimos en et apartado de los bucles for. En ef caso que no se pueda vectorizar un troz0 de cédigo los lazos iran mas ripidos si se utiliza el predimensionamiento de los vectores en los cuales los resultados son almacenados. ‘Vamos a ver un ejemplo: El tiempo obtenido para este caso en el que no hay predimensionamiento de vector es: > 0.0600 putime; untatledl; cputime-t a Programacién en Matlab Capitulo IH Enel caso de predimensionamiento, el cédigo es el siguiente: Y el resultado seria el siguiente: » tecputime; untitled2; cputime-t 0.0200 (a ‘Como se puede observar el tiempo de ejecucién se ha reducido una tercera parte, El comando cput:ime devuelve el tiempo en segundos que tarda en cjecutarse un proceso en Matlab desde que fue ejecutado. En este segundo caso hemos utilizado el predimensionamiento utilizando zeros, lo que hace que el bucle se ejecute significativamente mis répido. La razén es que sino haces un predimensionamiento et intérprete de Matlab tiene que redimensionar el vector en un elemento més cada vez que se produce la iteracién del bucle. Si el vector esté predimensionado, este paso se elimina y la ejecucisn es mas répida. ‘Ademés para aquellos que trabajan con grandes matrices en ordenadores con limitaciones de memoria, este predimendionamiento tiene un segundo beneficio: usa la memoria mucho mas eficientemente y ayudar si te ests quedando sin memoria. Ayuda porque la memoria tiende a fragmentarse alo largo de luna sesién Matlab de manera que puedes haber dejado mucha memoria libre, pero no suficiente espacio contiguo para mantener una variable grande. El predimensionamiento ayuda a reduc la ragmentacion. ‘Una optimizacién que hace Matiab por ti es que los argumentos con los que se Hama a una funcién, no son copiados al espacio de trabajo local de una funcién, a menos que se alteren los argumentos dentro de la funci6n, Esto significa que no hay penalizacién por pasar variables grandes a funciones. 2 Capitulo IV Las instrucciones de entrada-salida en Matlab son muy similares a las del lenguaje de programacién C. Las primera instruccién necesaria es saber como se abre un fichero, y esto se hace a través de la funcién fopen. La sintaxis es la siguiente: Id_de_fichero = fopen(nomfre_del_fichero, permiso) Esta funcién devuelve en la variable Td_de_fichero un entero. En el caso de que la apertura del fichero sea erténea, fopen devuelve -1. Exta variable es el primer argumento que se ha de pasar alas funciones de entrada-salida de ficheros. EI permiso es uno de los siguientes ‘strings’ c feotura w escritura (se crea el fichero si es necesario) we afladir (se crea el fichero si es necesario) oe lecturay escritura. (no crea el fichero) sw ‘runcar 0 crear para lectura y escritura ae abre para afiadir datos y para lectua (se crea el fichero si es necesario) ‘Tanto el permiso como el nombre del fichero son cadenas en Matlab. Zs cadenas en Matlab se encierran centre comillas simples (* cadena *) Por defecto, los ficheros son abiertos en formato binario, Para abrir un fichero de texto, hay que afta ‘t” ala cadena de permiso, por ejemplo ‘rt’ y ‘wt’ ara cerrar un fichero se dispone del comando fclose {Td_de_fichero). Cierra el fichero asociado al identficador de fichero Td_de_fichero. La funcién £e1ose retorma un —1 en caso de producirse tun error al cerra el fichero. La instruccién £close ( ‘al.1" ) cietra todos los ficheros excepto los asociados los identificadores de Sehers ly 2 1 ienicaor de hero 1s asocia con la sida etna y e2 se dete cone ror est ‘Van vez que ya sabsmos come abrir y cera cher vamos a ver como se pueden inotcr y sacar s. Ficheros binarios Para leer datos de un fichero binario se dispone de la funcién fread, La estructura es la siguiente: [A, cont] = fread(Id_de ichero, tamafio, precision) Esta funcién lee datos binarios del fichero especificado por el 1d_de_fichero y lo escribe en fa matriz. ‘A, Lavariable cont es opcional y retoma el nimero de elementos leidos exitosamente, El argumento tamatio es opcional. Si no se especifica, se le el fichero entero, Si se especifica, entradas vidas son ls siguientes: N Jee N elementos en un vector columna Int lee hasta el final del fichero [M,N] ee elementos hasta Henar una matriz MxN, por columnas. N puede ser inf, pero Mono puede ser inf, El argumento precisién controla el nimero de bits leidos para cada valor ¢ interpreta esos bits como caracteres, enteros o valores en coma flotante. Cualquicra de las siguientes cadenas, 0 a versién Matlab o sus equivalents en C o Fortran, pueden ser usados. Sino se especifica nada en preci sién, por defecto es ‘uchar’. Los valores numéricos son siempre devueltos en arrays de doble precisién. 2B Programacién en Matlab Capitulo IV ‘char? Carictr, 8 bits ‘unsigned char? Cardcter sin signo, 8 bits ‘signed char Carécter con signo, 8 bits ‘integer*1” Entero, 8 bits| ‘integer*2? Entero, 16 bits ‘integer*4? Entero, 32 bits ‘integers Entero, 64 bits ‘integer*1” Entero sin signo, 8 bits ‘integer*2? Entero sin signo, 16 bits ‘integer*#” Entero sin signo, 32 bits ‘integer*8? Entero sin signo, 64 bits ‘real*4? ‘Coma flotante, 32 bits ‘real*8” ‘Coma fotante, 64 bits Un ejemplo de esta instruccién seria lo siguiente: fid=fopen("fread.m', 'x'); Fsfread(fid); Length (F) Este fichero-M abriria el fichero de ayuda correspondiente a fread (siempre y cuando estuviésemos en ese directorio), y leerfa toda la ayuda, A continuaciéa da la longitud de los elementos leidos, La respuesta es la siguiente: 3913 Pata escribir datos binarios en un fichero, utilizaremos la instruccién fwrite. Su dectaracién es de la forma siguiente: Cont = fwrite(Td_de fichero, A, precisién) Esta funcién escribe las elementos de la matriz A en el fichero especificado, traduciendo los valores de ‘Matlabn a la precisién especificada. Los datos son escritos en formato columna.La variable Cont es el ‘iimero de elementos leidos satisfactoriamente, El argumento precisién controla la forma y tamafio de el resultado, Los valores permitidos se ‘encuentran en fread. Como ejemplo veamos el siguiente caso: fid = fopen{'magicS.bin", 'wb'); Ewrite(fid,magic(5), 'integer*4"); fclose(£id) + Este ejemplo crea un fichero Uamado ‘magicS bin’. Este fichero ocupa 100 bytes conteniendo 25 clementos de! cuadrado magico 5x5, almacenados en enteros de 4 bytes. El resultado esta en forma binaria y al intentar leerlo con un editor 0 procesador de textos nos saldrian caracteres extraios. 24 Programacién en Matlab Capitulo IV Entrada-Salida de ficheros con formato Para leer de un fichero con formato se dispone de la funcién fscant. [A, cont] = fscanf(Id_de_fichero, formato, tamafio) Esta funcién lee datos de un fichero especificado por Id_de_fickero, lo convierte de acuerdo a el formato especificado, y lo devuelve a la matriz.A. La variable Cont es un argumento de salida opcional que devuelve el nimero de elementos leidos saisfactoriamente. Size es opcional. Pone un limite al mimero de elementos que pueden ser leidos del fichero. En caso de ‘no especificarlo, se considera el fichero entero, Si se especifica, los valores validos son los siguientes: N lee N elementos en un vector columna Inf lee hasta el final det fichero [M,N] Jee elementos hasta Hlenar una matriz MxN, por columnas. N puede ser inf, pero Mono puede ser inf. El formato es una cadena que contiene especificaciones del enguaje C. Los formatos constan de la siguiente estructura: tanchura_del_datotcaracteres_de conversion La forma de escribir la anchura del dato es ecribir primero el nimero total de digitos, un punto y el ‘niimero de digitos decimales. Los caracteres de conversion son los siguientes: 4 > enteros con signo, en base 10 > enteros con signo, en base 10 > enteros sin signo, en base 10 > eateros sin signo, en base 8 > enteros sin signo, en base 16 > valor con signo, de la forma [-]d.dddde|++Jddd > valor con signo, de fa forma [-Jdddd.dddd valor con signo, en formato fo e (el que sea ms compacto para la valor dado) > cadena de caracteres © > caracteres emo xonn Por lo tanto un formato valido seria: $9.4 Este formato nos informa de una variable que tendria al menos una anchura de 9 digitos, de los cuales 4 serian decimales. El caricter de conversién %s, quita los espacios en blanco. Si queremos que los espacios en blanco también se lean, uilizaremos el carécter de conversién %c. Por ejemplo: 8 = fscanf(fid,’ $s") lee y devuelve una cadena de caracteres A= fscanf (fid,’ 85d") lee enteros decimales de 5 digitos Para escribir datos formateados en un fichero, utilizamos la funcién fprinttf. el Cont = fprint£(Id_de_fichero, formato, A, Esta funcién formatea los datos en la parte real de la matriz A, bajo la cadena especificada en formato, ‘y lo escribe en el fichero asociado a Td_de_fichero. La variable cont especifica el nimero de bytes escritos de forma correcta. El formato es cl mistmo que para el caso de fs cant. ‘Al igual que en el lenguaje C, aqui también estn disponibles las llamadas secuencias de escape Todas se forman anteponiendo el caricter ‘backslash’. ‘A continuacién vamos a ver algunas: 25 Programacién en Matlab Capitulo IV nos posiciona en a siguiente nea produce un “backspace” > produce un retomno de carro > tabulador aces Para producir el caricter ‘backslash’ escribiremos \\ y para producir el caricter de porcentaje escribiremos #3. La funcién fprint £ procesa solo la parte real de cada pardmetro, ‘Veamos el siguiente ejemplo: » 2534457 > fprint£("Bl valor de z es $d \n',z) Bl valor de z es 3 Como se puede apreciar no se ha impreso el niimero complejo completo, Para imprimir ef nimero ‘complejo, lo tendriamos que hacer de la siguiente manera. » fprint£('El valor de z es §d+8dj\n', real (z),imag(z)) El valor de z es 314) ‘Como vimos en el capitulo anterior, os bucles son muy lentos. A la hora de escribitlos, estos se pueden vitarcreando matrices, como se ve en el siguiente ejemplo, O.4:ay xz exp(x)]; 8 matriz creada para evitar bucles 6.2£ exp(x)=812.8£\n",¥) 3 ¥ fprinte(’ La salida seria la siguiemte 0.00 exp(x)= 1-00000000 0.10 exp(x)= 1.10517092 0.20 exp(x)= 1.22140276 0.30 exp(x)= 1.34985861 0.40 exp(x)= 1.49182470 0.50 exp(x)= 1.64872127 0.60 exp(x)= 1.82211680 0.70 exp(x)= 2.01375271 0.80 exp(x)= 2.22554093 0.90 exp(x)= 2.45960311 1.00 exp(xj= 2.71828183 En el caso de tener que representar mas de 2 variables, tendriamos que definir una matriz de tantas dimensiones como variables tengamos. La sintaxis seria la siguiente: Matriz = [varl; var2; ... ;varn] Las variables (varl, vec2, ..., varn] son vectores fila, y es necesario que todos tenga la sisma dimensién, porque en caso contrario se produciria un error. En caso de que fueran matrices, estas las tendriamos que convertir a vectores fila, La forma mis fécil de: hhacer esta conversion es a través de la funcion reshape. 26 Programaciin en Matlab, Capitulo IV La sintaxis de esta funcién ¢s la siguiente: reshape (matriz, nueva_dim fila, nueva_dim col) Supongamos una matriz A de dimensién 3x3, Para convertiniaa un vector fila tendriamos que ejecutar la siguiente instrucci6n: Teshepe(A, 1, 9) La forma de construccién de este nuevo vector es la siguiente. Primero coloca todos los elementos de la primera columna., a continuacién los dela segunda, después los de la tercera, y asi sucesivamente, Esto queda mejor explicado en el siguieme ejemplo 12 2 3 9 8 aie 2 » reshape (m,1,10) 1 2 0] ay ay a 3 8 2 2 ‘Una de las cosas que no hay que olvidar es poner la secuencia de escape de nueva linea (\n). En caso de rng hacerlo nos saldrian cosas como estas: 521s yelx; exp (x)]+ fprinté (*x=86.2£ exp (x) 6.3£" yy)? La salida de esto seria lo siguiente: [x= 0.00 exp(x)= 1.000 x= 0.50 exp(x)= 1.649 x= 1.00 exp(x)= 2.718 ‘Como se puede apreciar este resultado no esta excesivamente claro. Un problema mayor se daria si en caso de tener 3 resultados como en este ejemplo, tuvigramos 10. En este itimo caso esté claro que la forma de expresar los resultados seria muy confusa. Un aspecio relacionado con la velocidad de ejecucién de un fichero-M en Matlab, es el modo de apertura © eseritura de ficheros, es decir, si trabajamos con ficheros de texto o ficheros binarios. ‘Trabajar con ficheros binarios hace que el programa tarde menos en ejecutarse que en el caso de que ‘rabajéramos con ficheros de texto. “Vamos a ver unos ejemplos donde esto queda patente: @ Fichero binario 8 Fichero de texto fid=fopen(*fread.m',"x"); fid-fopen('fread.m','rt")+ Psfread(fid); Fefscanf (fid, *8c") + Length (F) Length (F) n Programacién en Matlab Capitulo 1 Estos ficheros-M nos dan como resultado la longtud de los caracteres lefdos. Ademés vamos a ver el tiempo que tardan en gjecutarse con cput-ime. 3913 3913 0.0400 0.0800 EI resultado de la izquierda comesponde al fichero binario y el de ta derecha a el de texto. El primer resultado es el mimero de caracteres leidos, que como vemos coincide. El segundo valor corresponde al tiempo de ejecucién. En este caso el tiempo de ejecucién del programa del fichero binario es la mitad del de texto. Para leer lineas de ficheros disponemos de dos instrucciones fget y fgets. La diferencia entre estas dos funciones es que la primera descarta el cardcter de mueva linea y la segunda guarda ese caricter de nueva Iinea Lassintaxis de fget1 es la siguiente: linea fgetl(Id_de_fichero) Esta funcién devuelve la préxima linea del fichero asociado a Id_de fichero, como una cadena Matlab. Si solo se encuentra un fin de fichero, devuelve -1. Se suele utilizar solo en ficheros de texto ya que si tenemos un fichero binario sin caracteres de nueva linea, fget: puede tardar mucho en ejecutarse Para fgets la sintaxis es la siguiente: linea = fgetl(Id_de_fichero, near) Devuelve hasta ncax caracteres de la siguiente linea. Caracteres adicionales no son leidos después de la finalizacién de linea(s) 0 de fin de fichero. Si no se especifica nar se lee la linea completa Por la misma razén que fgetL, esta funcién se suele usar solo en ficheros de texto. ‘Con estas instrucciones ya podriamos proceder a leer cualquier fichero de text. Supongamos el siguiente t10z0 del fichero “datosdis.txt: LAS. DISCONTINUIDADES Namero de guias 3 Frec. inic Frec. fin Frec. paso (en GHz) 0 see tehase seu senses sae laeveee 1 8.0000 12.0000 0.8000 En este fichero, los mimeros de la izquierda representan el nimero de lineas. En el fichero original no «stn pero aqui se ponen para mayor claridad del ejemplo. En este fichero los dafos que nos interesan son el mimero de guias y las frecuencias inicial, final y de aso. Asi mismo vamos a construir una funcién llamada sato.m. Esta funcién lo que va a hacer es saltar tantas lineas como le indiquemos, que para nosotros no contienen informacién valida, 28 Programaciéin en Matlab Capitulo La funcién quedaria asi: function salto(fich, lin) for contad=1:lin fgetl (fich) ; end Los argumentos que le damos a esta funcién son el Id_de_fichero (£ich), y el mimero de lineas a saltar (Lin) Para leer los valores que nos interesan del fichero podriamos utilizar el siguiente fichero-M. fidl=fopen(*datosdis.txt', 'rtt') if (£idi==-1) disp(*ERROR AL ABRIR EL FICHERO DATOSDIS.TxT') end salto(fidl, 6); nguias=fscanf (fidl, '#d') salto(fidl, 2); freq=fscanf(fidl,'£')7 fin=freq(1) £fin=treq(2) fpaso=freq(3) felose(fidl); Lo que hace este programa es saltar las primeras 6 lineas (salto (fd, 6)), después lee el nimero de guias. Esto lo hacemos con la funcién £ scant. Esta funcién se posiciona en la linea 7, lee el valor y pasa ala linea 8. A continuacién se produce un salto de 2 lineas (salto (fia, 2)), que som las lineas 9 y 10, y sc Ieen las frecuencia, que se encuentran en la linea 11. Todas las frecuencias leidas se almacenan en l array freq de dimension 3, La salida producida por este fichero-M es la siguiente: nguias fin ‘Como se puede observar los resultados han sido leidos correctamente. La tiltima funcién relacionada con la entrada-salida con formato es la orden input. Esta funcién escribe una cadena y espera la entrada de datos desde el teclado, El formato de esta funcién es la siguiente: 29 Programacién en Matlab Capitulo V R = input (cadena) Por ejemplo, podriamos escribir lo siguiente: § = input (‘Valor de la frecuencia’} La entrada puede ser cualquier expresién Matlab, la cual serd evaluada, usando las variables en el espacio de trabajo actual, y el resultado sera devuelto en S. Si el usuario presiona la tecla ‘return’ sin ningin valor como entrada, input devuelve una matrz.vacia. La instruccién input se puede combinar con uno o varios “in. Conversién de cadenas Dentro de este apartado nos encontramos con 2 funciones sprintf y scant, La funcion sprint sirve para escribir datos formateados a una cadena, Su sintaxis es la siguiente: (8, ERRMSG] = sprintf (formato, A,...) El objetivo de esta funcién es dar formato a los datos en la parte real de la matriz. A, controtado por la cadena formato. El valor devuelto se almacena en la variable S. Ademas ERRMSG ¢s un argumento de salida opcional que devuelve un mensaje de error, en forma de cadena, si ocurre un error o una mati ‘vacia si dicho error no ocurre. 1 formato se especifica en la funcién £scant. La funcion sprinté es la misma que fprint£ excepto por el hecho de que la primera devuelve los datos en una cadena Matlab, y la segunda los escribe en un fichero. La funcién scant lee cadenas bajo el control especificado en formato. Su sintaxis es la siguiente: IA, cont, ERRMSG, ProxIndex] = sscanf (8, formato, tamafio) Esta funcién lee los datos de Ia cadena 8, los convierte a través de lo especificado en formato y lo devuelve a la matriz.A La variable cont es un argumento opcional y devuelve el nimero de elementos leidos satisfactoriamente. Al igual que en sprintf, ERRMSG es un argumento opcional que devuelve ‘un mensaje de error si ocurre un error, y devuelve unt matriz vacia en caso contrario, El objetivo del argumento opcional Proxtndex ¢s especificar uno més que el niimero de caracteres escaneados en 5. La funcién sscanf y fscanf se diferencian en que la primera Ice los datos de una varible cadena y 1a segunda, mas bien lee los datos de un fichero. Posicionamiento de ficheros La primera funcién asociado al posicionamiento de ficheros es feof. La sintaxis es la siguiente: feof (1d_de_fichero) Esta funcién devuelve un I si se ha fijado el indicador de fin de fichero (end-offile) y 0 en otro caso. EL indicador de fin de fichero se fija cuando el indicador de posicin del fichero alcanza el fin del fichero, La funcién £seek fija el indicador de posicién de fichero. Su sintaxis es la siguiente: estado = fseek (Id de fichero, offset, origen) Esta funci6n reposiciona el indicador de la posicién del fichero dado por Id_de_fichero a el byte con el offset especificado relativo al ori.gen. Los valores de offset: son interpretados como sigue: >0 — Semueve hacia el fin de fichero =0 — Nocambia de posicién <0 Semueve hacia el comienza de fichero 30 Programacién en Matlab Capitulo 1 Los posibles valores de ori.gen son: ‘bof’ 0-1 Comienzo de fichero ‘eof 0 — Posicién actual en el fichero ‘eof o 1 Finde fichero La variable estado almacena un 0 en caso de éxito y un —1 en caso de fallo. En caso de que ocurra un error deberiamos usar fer ror para obtener més informacién. La sintaxis de esta funcion es la siguiente: Imensaje, ERRNUM] = ferror (Id_de_fichero) Devuelve en la variable mensaje el mensaje de error para la operacién de entrada-salida més reciente asociada al fichero especificado. El argumento opcional ERRNUM contiene el nimero de error. Si la operacién de entrada-salida mas reciente fue exitosa, Ia variable mensaje es una matriz vacta y ERRNUM contiene el valor 0. Un valor de ERRNUM distinto de cero da a entender que se ha producido un error. La funcién £t¢11 obtiene el indicador de posicin de fichero. La sintaxis es la siguiente posicién = ftell (Id de_fichero) La posicién esta indicada en bytes desde el inicio del fichero definido por el 1d_de_fichero. Si la funcién devuelve ~1 indica que la consulta no fue exitosa La tiltima funcién que nos queda es frewind. La sintaxis es la siguiente: frewind (Id_de_fichero) Esta funcién lo que hace es fijar el indicador de posicién al comienzo del fichero asociado con el idemificador de fichero 14_de_fichero. Funciones de importacién/exportacién de ficheros De todas las funciones que aparecen en este apartado nos vamos a quedar con dos. Estas dos funciones son Load y save. Para més informacién siempre se puede recurtira la ayuda de Matlab. La funcién save guarda un espacio de trabajo a un fichero-MAT. La sintaxis de esta funcién es la siguiente: save nombre Guarda todas las variables del espacio de trabajo a el fichero binario Hamado ‘nombre.mat’. Si no especificamos el nombre de fichero la funcién save usa como defecto el nombre de fichero “matlab mat’. Como se puede observar, solo es necesario que le demos el nombre del fichero y no hace falta que se le de la extensién. save nombre x ‘guarda solo la variable x del espacio de trabajo save nombre x y 2 guarda las variables x, yz. Se puede utilizar el cardcter “*" para referirse a variables que responden a un mismo patron. Se utiliza de igual manera que lo hace en DOS. save pepe x* ‘guardaria en el fichero “pepe. mat” todas las variables que empiezan por x. save nombre x y z ~append __aflade las variables a un fichero-MAT existente, 31 Programacién en Matlab Capitulo IV. Las variables guardadas con save se pueden recuperar con Load. Su sintaxis es la que sigue: load nombre Este comando haria que se recuperasen las variables del fichero-MAT ‘nombre.mmat’ El comando 1oaci por si solo cargaria las variables del fichero ‘matlab mat’. load nombre x y 2 ... — cargara solo las varibles especificadas (xy 2). ‘Al igual que con save también se puede utilizar el comodin “*” Con este cuarto capitulo hemos legado al final de esta intreduccién a la programacién en Matlab. Si se uiere seguir profundizando en el mundo de Matlab solo queda una solucién y esta es la prctica, 32.

Вам также может понравиться