Práctica 1 Introducción a Matlab Este documento es una pequeña introducción a MATLAB. Un documento mejor elaborado y más extenso es “Aprenda Matlab 7.0 como si estuviera en primero” que puede obtenerse en http://www.tayuda.com MATLAB viene de “MATrix LABoratory'”; se trata de un programa especializado en los cálculos con matrices que puede llegar a ser muy útil en cuanto se sabe cómo trabajar con él, pues nos permite, con poco esfuerzo, desde hacer los cálculos rutinarios con matrices, a escribir programas para hacer tareas más complejas de forma muy sencilla. Dado que los escalares son matrices 1× 1 , MATLAB también trabaja con ellos sin ningún problema. Podemos hacer con matrices cualquier operación: sumar, restar, multiplicar, potencias, …simplemente hemos de tener en cuenta que las matrices tendrán que ser de las dimensiones adecuadas, aunque en caso de no ser así, el programa nos lo avisará con un mensaje de error. 1 Entorno gráfico de Matlab Figura 1.- Entorno de trabajo en MATLAB Una vez arrancado MATLAB, aparece una pantalla como la de la Figura 1. En la parte derecha tenemos la Command Window. Ésta es la ventana en la que se ejecutan interactivamente las instrucciones de MATLAB y en donde se muestran los resultados correspondientes, si es el caso (en la figura se puede ver la matriz M después de haber sido creada). En la Command Window vemos >> eso significa que MATLAB está esperando que le introduzcamos un comando En la parte inferior izquierda tenemos el Command History. El Command History ofrece acceso a las sentencias que se han ejecutado anteriormente en la Command Window. Estas sentencias están también accesibles por medio de las teclas ↑ y ↓. Las sentencias ejecutadas anteriormente se pueden volver a ejecutar mediante un doble clic o por medio del menú contextual que se abre al clicar sobre ellas con el botón derecho. También se pueden copiar y volcar sobre la línea de comandos, pero se ha de copiar toda la línea, sin que se admita la copia de un fragmento de la sentencia. En la parte superior izquierda tenemos una zona que alterna entre Workspace y Current Directory. El Workspace contiene información sobre todas las variables que se hayan definido en esta sesión y permite ver y modificar las matrices con las que se esté trabajando (haciendo doble clic sobre ellas, Figura 2). Figura 2.- Editor de matrices Figura 3.- Vista del Current Directory El Current Directory muestra los ficheros del directorio actual (Figura 3) y nos permite navegar por los directorios del ordenador de forma análoga a la del Explorador de Windows (modificando así el directorio actual). El concepto de directorio actual es muy importante en MATLAB. Los programas de MATLAB se encuentran en ficheros con la extensión *.m. Estos ficheros se ejecutan tecleando su nombre en la línea de comandos (sin la extensión), seguido de los argumentos entre paréntesis, si se trata de funciones. No todos los ficheros *.m que se encuentren en el disco duro son accesibles sin más. Para que un fichero *.m se pueda ejecutar es necesario que se cumpla una de las dos condiciones siguientes: 1. Que esté en el directorio actual. MATLAB mantiene en todo momento un único directorio con esta condición. Este directorio es el primer sitio en el que MATLAB busca cuando desde la línea de comandos se le pide que ejecute un fichero. 2. Que esté en uno de los directorios indicados en el Path de MATLAB. El Path es una lista ordenada de directorios en los que el programa busca los ficheros o las funciones que ha de ejecutar. Muchos de los directorios del Path son propios de MATLAB, pero los usuarios también pueden añadir sus propios directorios, normalmente al principio o al final de la lista. Los ficheros *.m mostrados en la ventana Current Directory se pueden abrir con el Editor/Debugger mediante un doble clic (Figura 4). Figura 4.- Editor de ficheros *.m 2 Primeros contactos Lo primero que podemos hacer es escribir lo siguiente en la Command Window: >> 1+1 ans = 2 MATLAB ha resuelto la operación que le hemos indicado y ha almacenado en la variable ans (answer) el resultado de la misma. Siempre que no se indica explícitamente la variable a la que se quiere asignar el resultado de una operación, MATLAB asigna, de forma implícita, el resultado de la operación a la variable ans. Así, resulta más recomendable escribir este otro comando: >> x=1+1 x = 2 el resultado de la operación se almacena en la variable x. Es importante indicar que MATLAB distingue entre mayúsculas y minúsculas (case-sensitive). Si tras el comando anterior escribimos un ‘;’ entonces el resultado de la operación no se muestra en la ventana de comandos: >> x=1+1; Podemos ordenar varios comandos en la misma línea separándolos por ‘,’. >> y=3, x^y y = 3 ans = 8 Dos comandos muy importantes son el comando help y el comando helpwin. El comando lookfor sirve para buscar funciones relacionadas con una palabra: >> lookfor correl Nos muestra una lista de funciones relacionadas con la palabra correl y nos da una pequeña descripción de esas palabras. Otra instrucción interesante es: >> format compact Esta intrucción hace que las salidas por pantalla que genera el MATLAB sean más compactas (elimina muchos saltos de línea innecesarios). 3 Trabajando con el Workspace Si en un determinado momento necesitamos salir de MATLAB, puede resultar interesante guardar el trabajo que llevamos hecho para poder recuperarlo cuando volvamos a utilizar el MATLAB. Las variables que vemos en el Workspace se encuentran almacenadas en memoria y al salir de MATLAB desaparecen. Para no perder el contenido de estas variables debemos teclear: >> save antes de abandonar el programa. Este comando crea en el directorio actual un fichero binario llamado matlab.mat en el que se encuentran almacenadas las variables del Workspace. La próxima vez que arranquemos el programa podemos recuperar estas variables tecleando: >> load Tal y como hemos utilizado el comando save, hemos guardado todas las variables del Workspace. En ocasiones puede interesarnos guardar variables de forma selectiva y en un fichero con un determinado nombre: >> save fichero x y Este comando crea un fichero llamado fichero.mat en el directorio actual con las variables x e y. Para recuperar estas variables debemos escribir: >> load fichero Cuando queremos eliminar alguna variable del Workspace debemos utilizar el comando clear en alguna de sus múltiples formas. >> clear y borra la variable y. Si no le damos el nombre de ninguna variable borra todas las variables. 4 Vectores y matrices Veamos cómo podemos crear una matriz: >> A=[1 2 3 4 5 6 7 8 9] A = 1 4 7 2 5 8 3 6 9 El comando anterior ha creado una matriz 3x3. Podríamos haber creado la misma matriz con cualquiera de los dos siguientes comandos: >> A=[1 2 3; 4 5 6; 7 8 9]; >> A=[1,2,3; 4,5,6; 7,8,9]; Así, podemos utilizar de manera indistinta el espacio en blanco o la coma para separar columnas y el salto de línea o el punto y coma para separar filas. Podemos también crear matrices a partir de otras matrices: >> >> >> >> >> a=[1 b=[2 c=[3 d=[4 M=[a 1; 1 1]; 2;2 2]; 3;3 3]; 4;4 4]; b; c d] M = 1 1 3 3 1 1 3 3 2 2 4 4 2 2 4 4 En MATLAB tenemos los siguientes operadores matriciales: + adición o suma – sustracción o resta * multiplicación ' traspuesta ^ potenciación \ división-izquierda / división-derecha .* .producto elemento a elemento ./ y .\ división elemento a elemento .^ elevar a una potencia elemento a elemento Existen varias funciones para crear matrices: zeros, ones, rand, magic, etc. >> m = ones(2,4) m = 1 1 1 1 1 1 1 1 Hay funciones para conocer la dimensión de una matriz: >> [f c] = size(m) f = 2 c = 4 Esta función devuelve el número de filas y de columnas de la matriz >> length(m) ans = 4 length devuelve el mayor valor de filas o columnas de la matriz. Es útil cuando se trabaja con vectores fila o vectores columna. En este caso devuelve la dimensión del vector. Con el operador ‘:’ podemos definir vectores: >> v = 1:5 v = 1 2 3 4 5 >> v = 1:2:5 v = 1 3 5 La sintaxis es “valor inicial : incremento : valor límite”. Se puede omitir el incremento y en ese caso se entiende que el incremento es 1. El incremento puede, por supuesto, ser negativo. En MATLAB es sencillo borrar filas o columnas de una matriz: >> m=rand(3) m = 0.9501 0.2311 0.6068 0.4860 0.8913 0.7621 0.4565 0.0185 0.8214 0.8913 0.7621 0.0185 0.8214 >> m(1,:)=[] m = 0.2311 0.6068 >> m(:,2)=[] m = 0.2311 0.6068 0.0185 0.8214 Ojo con la comparación de igualdad en matrices: >> a=[1 2; 3 4]; b=[1 2; 3 3]; >> a==b ans = 1 1 1 0 >> a~=b ans = 0 0 0 1 El operador ~= es el equivalente a != en C. En este caso lo hace elemento a elemento. Si queremos saber si dos matrices son iguales tenemos que utilizar isequal: >> isequal(a,b) ans = 0 Tenemos funciones como any, all y find que chequean si las componentes de una matriz cumplen una determinada condición: >> a=magic(3) a = 8 1 3 5 4 9 >> any(a>7) ans = 1 1 >> all(a>2) ans = 1 0 >> find(a>4) ans = 1 5 6 7 8 6 7 2 0 0 any chequea por columnas si alguno de los elementos de la columna cumple una determinada condición (en el ejemplo que sean mayores que 7). all chequea por columnas que todos los elementos de la columna cumplan la condición. find devuelve los índices de la componente de la matriz que cumplen la condición. Los elementos de la matriz se numeran de arriba abajo por columnas. 5 Programación en MATLAB MATLAB considera como comentario todo lo que hay desde el carácter ‘%’ hasta el final de línea. Veamos los esquemas que admite MATLAB. La sentencia if: if condicion1 bloque1 elseif condicion2 bloque2 else bloque3 end La sentencia switch switch expresión case exp1, bloque1 case exp2, bloque2 otherwise, bloque3 end Cuando casa con una de la expresiones ejecuta su bloque y finaliza el switch. La sentencia for: for i=1:n Bloque end for i=vector Bloque end En vector están almacenados los valores que tomará la variable i. La sentencia while: while condición Bloque end En MATLAB se pueden crear ficheros de comandos (scripts) o funciones. Ambos se crean en ficheros *.m. Solo pueden ejecutarse aquellos ficheros *.m que se encuentran en el directorio actual o aquellos que se encuentran en el path de MATLAB. Para invocar un script o una función contenida en un fichero *.m solo hay que escribir el nombre del fichero (sin el .m) Si queremos hacer una función la primera línea del fichero debe seguir la siguiente sintaxis: function [valores retorno] = nombre(argumentos) El fichero debe llamarse como la función. El siguiente ejemplo muestra el contenido del fichero prueba.m: function [suma resta] = prueba(A,B) suma = A+B; resta = A-B; Veamos cómo se utiliza: >> a=[2 2;2 2];b=[3 3;3 3]; >> [s r] = prueba(a,b) s = 5 5 5 5 -1 -1 -1 -1 r = 6 Entrada y salida de datos Se pueden importar datos de ficheros de texto. Si tenemos el fichero datos.txt: 1 2 3 4 5 6 Y escribimos: M=load(‘datos.txt’); Almacena en M los datos del fichero. Si los datos están en un fichero csv (datos.csv): 1,2,3 4,5,6 los podemos almacenar utilizando la función: M=csvread(‘datos.csv’); Hay otras funciones como textread que permiten cargar datos con otros formatos. Para escribir datos a fichero se tienen las funciones fopen, fclose y fprintf. También existe fscanf que podemos utilizar para leer un fichero. >> [f,t]=fopen('salida','w') f = 3 t = '' >> fprintf(f,'la matriz es de dimensión %dx%d\n',size(a)) ans = 30 >> fclose(f); Fopen retorna el identificador de fichero y un texto en caso de error. Fprintf retorna el número de caracteres escrito. Después de cerrar el fichero, si comprobamos su contenido veremos que tiene: la matriz es de dimensión 3x3 Si queremos que la salida vaya a la ventana de comandos sin utilizar fichero podemos utilizar fprintf sin indicar el identificador de fichero: >> fprintf('la matriz es de dimensión %dx%d\n',size(a)) la matriz es de dimensión 3x3 Otras funciones de entrada salida útiles son input y disp. Suelen utilizarse en scripts o funciones para interactuar con el usuario. Así, podemos solicitar que se introduzca un valor para una variable a través de la ventana de comandos utilizando la instrucción input: >> x=input('dame el valor de la x = ') dame el valor de la x = 13 x = 13 La función disp permite visualizar el contenido de una variable sin que aparezca el nombre de la variable: >> a=zeros(3); >> disp(a) 0 0 0 0 0 0 0 0 0 7 Gráficos MATLAB de varias funciones para crear gráficos 2-D y 3-D. La función plot es la más básica de todas ellas. Veamos un ejemplo: >> x=0:pi/10:2*pi; >> y=sin(x); >> plot(x,y) El resultado puede verse en la figura 5. Figura 5. Un ejemplo con plot