Pontifica Universidad Católica de Valparaíso Facultad de Recursos Naturales Escuela de Ciencias del Mar Av. .Altamirano 1480 - Casilla 1020 – Teléfono 56-32-2274257 Introducción al trabajo con Matlab Apuntes para el curso Series de Tiempo en Oceanografía Dr. Samuel Hormazábal Fritz Escuela de Ciencias del Mar Pontificia Universidad Católica de Valaparaíso Chile Índice Introducción 1.- Aspectos básicos 2.- Vectores y matrices: definición y operaciones 3.- Extracción de filas y columnas de una matriz 4.- Algunas funciones útiles 5.- Matrices y vectores que contengan “NaN” 6.- Programación estructurada 7.- Despliegue de datos con formatos 8.- Leer y guardar datos 9.- Gráficos 10.- Interpolación 11.- Funciones de usuario ANEXO: Toolbox Página 2 Introducción Matlab (Matrix Laboratory) es un lenguaje de programación de alto nivel orientado al trabajo con vectores y matrices. Matlab integra la computación, visualización y programación en un ambiente fácil de usar, donde los problemas y soluciones son expresados en una notación matemática familiar. El uso típico de Matlab incluye aplicaciones en: 1. Computación y matemáticas 2. Desarrollo de algoritmos 3. Modelación y simulación 4. Exploración, visualización y análisis de datos 5. Aplicaciones graficas Consideraciones: 1. no se declaran las variables, como en Fortran, c, c++ 2. Trabaja con doble precisión 3. Distingue mayúsculas y minúsculas 1.- Aspectos básicos help: El comando “help” acompañado con el nombre de la función o programa, entrega información de lo que hace la función o el programa. Este es muy útil cuando no se sabe usar una función en particular. Ejemplo 1.1 help inv INV Matrix inverse. INV(X) is the inverse of the square matrix X. A warning message is printed if X is badly scaled or nearly singular. See also SLASH, PINV, COND, CONDEST, LSQNONNEG, LSCOV. En la última línea entrega otras funciones relacionadas con la función que se esta interrogando. Para obtener operadores y caracteres especiales podemos tipiar ‘help ?’ pwd: El comando pwd permite desplegar el directorio (carpeta) en que se esta trabajando. Ejemplo 1.2 Página 3 pwd ans = C:\matlabR12\work whos: El comando whos entrega una lista de las variables que se están utilizando. En la lista se indica el nombre, la longitud (dimensión del arreglo) y el tamaño (numero de bytes) de cada variable. what: El comando what entrega un listado de los programas que se encuentran en el directorio en que se esta trabajando. Ejemplo 1.3 what M-files in the current directory C:\matlabR12\work eje1 eje2 eje3 f1 newton ra_ejemplo rm_newton ls: El comando ls muestra todo los archivos, carpetas, datos en el directorio de trabajo Ejemplo 1.4 ls ESTACIONES.txt Programa01_1997.m eje2.m eje3.m perfiles.m respaldo1.m cd: El comando cd (change directory) permite cambiar el directorio de trabajo. Ejemplo 1.5 cd d:\ocefisica\programas cd('d:\ocefisica\programas') addpath: Permite añadir un directorio al entorno del matlab. La carpeta se instalará mientras se este trabajando. Ejemplo 1.6 addpath d:\dataproc\rutinas - begin addpath('d:\dataproc\rutinas ') path(path,'c:\sam\matlab\plan_crucero'); Página 4 2.- Vectores y matrices: definición y operaciones • Un vector fila o columna se puede definir de la siguiente forma: a = [1 2 3 4] a = 1 2 3 4 a = [1, 2, 3, 4] a = 1 2 3 4 a = [1 2 3 4]' a = 1 2 3 4 a = [1; 2; 3; 4] a = 1 2 3 4 a = 1:10 a = 1 % Crea un vector correlativo del 1 al 10. 2 3 4 5 4 7 10 13 6 7 8 9 10 a = 1:3:15 a = 1 • Un matriz se puede definir de las siguiente forma: A = [1 2 3 4; 5 4 6 7; 1 4 8 5] A= 1 5 1 2 4 4 3 6 8 4 7 5 Página 5 A = [1 2 3 4 5 4 6 7 1 4 8 5] A= 1 5 1 2 4 4 3 6 8 4 7 5 Nota: si se coloca (;) al final de la línea, la variable no se despliega en pantalla. Tabla 2.1. Operadores de vectores y matrices Operador Nombre * / + ./ .* ^ .^ ' Multiplicación División Resta Suma División elemento a elemento Multiplicación elemento a elemento Exponente Elevar a exponente elemento a elemento Transpuesta. Ejemplo 2.1 a = [3 4; 4 6]; b = [5 9; 11 26]; c = a*b c = 59 86 % Multiplicación de dos matrices 131 192 d = a.*b d = 15 44 % Multiplicación elemento a elemento 36 156 e = d' % Transpuesta de una matriz. e = 15 36 44 156 Nota: El símbolo porcentual (%), se utiliza para introducir comentarios. Página 6 3.- Extracción de filas y columnas de una matriz Cuando se trabaja con una matriz de datos, por ejemplo un archivo conteniendo varias series de tiempo, generalmente no toda la matriz de datos se utiliza para el análisis y en estos casos es preferible extraer solamente las columnas o filas de esa matriz. Ejemplo 3.1. mat = magic(6) % El comando magic crea un cuadrado mágico de n x n. mat = 35 3 31 8 30 4 1 32 9 28 5 36 6 7 2 33 34 29 26 21 22 17 12 13 19 23 27 10 14 18 24 25 20 15 16 11 % Extrae las primeras tres filas de la matriz. % -------------------------------------------ej_31 = mat(1:3,:) ej_31 = 35 3 31 1 32 9 6 7 2 26 21 22 19 23 27 24 25 20 % Extrae las filas 1,3,5 y las columnas 2,4 y 6. % ---------------------------------------------ej_32 = mat([1 3 5],[2 4 6]) ej_32 = 1 9 5 26 22 12 24 20 16 % Extrae las columnas 5 y 6. % -------------------------ej_33 = mat(:,5:6) ej_33 = 19 23 27 10 14 18 24 25 20 15 16 11 % Extrae la ultima fila de la matriz. % ----------------------------------ej_34 = mat(end,:) ej_34 = 4 36 29 13 18 11 Página 7 % Elimina las dos primeras filas. % ------------------------------mat(1:2,:) = [] mat = 31 8 30 4 9 28 5 36 2 33 34 29 22 17 12 13 27 10 14 18 20 15 16 11 4.- Algunas funciones útiles Todas las funciones listadas en la tabla 4.1 operan sobre las columnas. Tabla 4.1. Funciones Función n = Length(x) [m, n] = size(x) [y, i] = sort(x) y = sum(x) y = mean(x) y = std(x) y = detrend(x) [y, i] = min(x) [y, i] = max(x) y = inv(x) y = cov(x) y = corrcoef(x) [vec, L] = eig(x) y = det(x) [U,S,V] = svd(x) Determina la longitud del vector. Determina la dimensión de un vector o matriz. Ordena los elementos de un vector en orden ascendente. Calcula la suma de un vector o matriz. Calcula la media de una vector o matriz. Calcula la desviación estándar de un vector o matriz. Remueve la tendencia lineal de un vector Encuentra el mínimo valor de una vector. Encuentra el máximo valor de una vector. Calcula la inversa de una matriz. Calcula la matriz de varianza y covarianza. Calcula la matriz de correlación. Calcula los valores y vectores propios. Calcula el determinante de una matriz. Descomposición de valor singular. Ejemplo 4.1. M = [0.9501 0.2311 0.6068 0.4860 0.8913 0.7621 0.4565 0.0185 0.8214 0.4447 0.6154 0.7919 0.9218 0.7382 0.1763 0.4057 0.9355 0.9169 [m n] = size(M) m = 6 n = 6 0.4103 0.8936 0.0579 0.3529 0.8132 0.0099 0.1389 0.2028 0.1987 0.6038 0.2722 0.1988 0.0153 0.7468 0.4451 0.9318 0.4660 0.4186]; % m = filas, n = columnas. ej_41 = sum(M) ej_41 = 3.9274 3.1484 4.0944 2.5378 1.6152 3.0236 Página 8 ej_42 = max(M) ej_42 = 0.9501 0.8214 0.9355 0.8936 0.6038 0.9318 0.6824 0.3201 0.4230 0.3695 0.2692 0.1693 0.5039 0.3140 3.6516 -1.4688 -2.1061 -0.6078 -4.7071 2.9938 0.1515 -0.5742 -0.0858 -0.3682 2.5297 -0.1942 -6.2199 5.3420 1.5353 3.1260 6.1310 -5.1305 -2.4158 1.5641 1.8567 -0.5998 0.9062 -0.6549 0.0000 0 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 0.0000 -0.0000 -0.0000 -0.0000 -0.0000 -0.0000 1.0000 -0.0000 -0.0000 0.0000 0 0.0000 -0.0000 1.0000 0.4697 -0.1843 1.0000 0.3877 -0.3970 -0.4411 -0.2521 -0.7617 0.3877 1.0000 0.0094 0.2283 -0.3074 -0.0950 -0.3970 0.0094 1.0000 0.7553 -0.7891 -0.3618 -0.4411 0.2283 0.7553 1.0000 ej_43 = [mean(M); std(M)] ej_43 = 0.6546 0.2702 0.5247 0.2949 ej_44 = det(M) ej_44 = -0.0194 ej_45 = inv(M) ej_45 = 5.7462 -4.4193 -1.3927 -1.6904 -3.6448 2.7205 2.7522 -2.5276 -0.6079 -0.7580 -4.6099 3.3097 Identidad = M * ej_45 Identidad = 1.0000 0 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 0.0000 0.0000 0.0000 0.0000 ej_46 = corrcoef(M) ej_46 = 1.0000 0.6117 0.4697 -0.2521 -0.3074 -0.7891 0.6117 1.0000 -0.1843 -0.7617 -0.0950 -0.3618 Tabla 4.2 Matrices predefinidas MATRICES PREDEFINIDAS x x x x x x = = = = = = magic(n) zeros(n,m) ones(n,m) eye(n,m) rand(n,m) randn(n,m) Crea Crea Crea Crea Crea Crea un cuadrado mágico de n x n. una matriz de ceros de dimensión n x m. una matriz de unos de dimensión n x m. una matriz identidad de dimensión n x m. una matriz con números aleatorios de dimensión n x m. una matriz aleatoria normalmente distribuida. ej_47 = zeros(3,6) ej_47 = Página 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ej_48 = ones(5) ej_48 = 1 1 1 1 1 1 1 1 1 1 0 0 0 % es lo mismo que ones(5,5) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ej_49 = rand(3,8) ej_49 = 0.8462 0.6721 0.6813 0.5028 0.3046 0.6822 0.1509 0.8600 0.5252 0.8381 0.3795 0.7095 0.1897 0.3028 0.6979 0.8537 0.2026 0.0196 0.8318 0.4289 0.1934 0.5417 0.3784 0.5936 Página 10 Tabla 4.3 Funciones trigonométricas FUNCIONES TRIGONOMETRICAS Y Y Y Y Y Y Y Y Y Y = = = = = = = = = = sin(x) cos(x) tan(x) asin(x) acos(x) atan(x) atan2(x) sinh(x) cosh(x) tanh(x) Calcula Calcula Calcula Calcula Calcula Calcula Calcula Calcula Calcula Calcula el el la el el el el el el la seno de x coseno de x tangente de x arco seno de x arco coseno de x arco tangente de x, entre –pi/2 y pi/2 arco tangente de x, entre –pi y pi. seno hiperbólico de x coseno hiperbólico de x tangente hiperbólica de x FUNCIONES MATEMATICAS ELEMENTALES Y Y Y Y Y Y Y Y Y = = = = = = = = = abs(x) angle(x) sqrt(x) exp(x) log10(x) log2(x) log(x) conj(x) rem(x,y) Calcula el valor absoluto de x Calcula el angulo de fase de un vector complejo de x Calcula la raiz cuadrada de x Exponencial de x Calcula el logaritmo en base 10. Calcula el logaritomo en base 2 Calcula el logaritmo en base e. Calcula el conjugado de un vector complejo. Entrega el residuo después de una división. FUNCIONES PARA REDONDEAR VALORES Y Y Y Y = = = = round(x) ceil(x) fix(x) floor(x) Redondea Redondea Redondea Redondea hacia hacia hacia hacia el el el el entero más cercano infinito (+) cero. infinito (-) 5.- Matrices y vectores que contengan “NaN” NAN significa “Not-a-Number” y es una representación aritmética que se utiliza para simbolizar resultados no definidos. ej_51 = 0/0 Warning: Divide by zero. ej_51 = NaN Ejemplo 5.1 A = [ 2 10 2 10 6 NaN 6 NaN 58 89 58 89 9 9 9 9 NaN NaN NaN NaN NaN 5 NaN 5 5 8 5 8 8 9 NaN 9 9 4 9 4 4 NaN 4 NaN NaN 25 NaN 25 25 NaN 25 NaN 36 88 25 30]; Una forma de verificar si una matriz o vector contiene datos NaN, es a través de la función isnan y find. isnan(A): entrega valores de ceros y unos. Los ceros indican que en esa posición existe un número. Los unos indican que en esas posiciones existen datos NaN. [I,J] = find(isnan(A)), entrega las posiciones ( fila y columna ) de los datos nan en la matriz. Página 11 val_nan = isnan(A) val_nan = 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 1 0 0 0 0 [I, J] = find( isnan(A) ); posiciones = [I J] posiciones = 2 4 1 2 3 4 1 3 3 2 4 1 3 2 4 2 2 5 5 5 5 6 6 8 10 10 11 11 12 12 Ejemplo 5.2: Eliminación de los NAN vec = [ 2 5 7 nan nan 2 5 4 nan 25 48 nan 3 4 10]; % Forma 1 de eliminar datos nan. % -----------------------------I = find(isnan(vec)==0); vec = vec(I); % Forma 2 de eliminar datos nan. % -----------------------------vec = vec(find(~isnan(vec))) Página 12 6.- Programación estructurada Tabla 6.1. Operador Nombre < > <= >= ~= & | ~ = = Menor que Mayor que Menor o igual que Mayor o igual que Distinto que Y O Negación lógica Igual que Sentencia if: La sentencia if : se usa para que se ejecute una determinada condición. if condición bloque end si existe más de una bifurcación o bucle, entonces: if condición1 bloque 1 elseif condición 2 bloque 2 elseif condición 3 bloque 3 else bloque 4 end Sentencia for: repite un conjunto de veces un determinado bloque. for i=1:n Bloque end for k = 1: n for j = 1: m bloque end end for i=1:n if condicion 1 bloque 1 elseif condicion 2 bloque 2 else bloque 3 end end Sentencia while: repite un conjunto de veces una determinada condición. while expression statements end Página 13 Sentencia switch: Ejecuta diferentes bloques dependiendo de la condición. Switch case case valor 1 bloque 1 case valor 2 bloque 2 ............ case valor N bloque N-1 otherwise bloque N end Ejemplo 6.1: x = [1 2 4 8 9 6 2]; n = length(x); suma = 0; fprintf(' Indice Suma Acumulativa \n') for i=1:n suma = suma + x(i); fprintf(' %2d %2d \n', i, suma) end resultado: Indice 1 2 3 4 5 6 Suma Acumulativa 1 3 7 15 24 30 % El mismo programa escrito de otra forma. % ---------------------------------------suma_acumulativa = cumsum(x); indice = [1:n]'; fprintf(' Indice Suma Acumulativa \n') fprintf(' %2d %2d \n', [indice suma_acumulativa']') Ejemplo 6.2. x = [1 2 4 8 9 6 2 1 2 3 1 5 4 4 8 2 5 61 2 0 32 6 0.95 0.3 0.1 14 10] ; n = length(x); y = x.*cos(pi*x/180) + 0.45253; desviacion = std(y); n_desv_1 = 0; n_desv_2 = 0; n_desv_3 = 0; vec_1std = []; vec_2std = []; vec_3std = []; for i = 1:n if y(i) > desviacion n_desv_1 = n_desv_1 + 1; vec_1std = [vec_1std; i y(i)] ; end if y(i) > 2*desviacion Página 14 n_desv_2 = n_desv_2 + vec_2std = [vec_2std; end if y(i) > 3*desviacion n_desv_3 = n_desv_3 + vec_3std = [vec_3std; end 1; i y(i)] ; 1; i y(i)] ; end y(vec_1std(:,1)) = nan; desv = [desviacion, 2*desviacion , 3*desviacion]; valores = [n_desv_1, n_desv_2 , n_desv_3]; ind = [1:3]; fprintf(' fprintf(' fprintf(' fprintf(' fprintf(' ------------------------------------ \n') Valores Desviacion estandar \n') ------------------------------------ \n') %2d %d-std, valor = %8.5f \n', [valores' ------------------------------------ \n') ind' desv']') resultado: -------------------------------------Valores Desviacion estandar -------------------------------------7 1-std, valor = 7.32841 2 2-std, valor = 14.65682 2 3-std, valor = 21.98523 -------------------------------------El mismo programa escrito de otra forma: I1std = find( y > desviacion); I2std = find( y > 2*desviacion); I3std = find( y > 3*desviacion); desv = [desviacion, 2*desviacion , 3*desviacion]; valores = [length(I1std), length(I2std) , length(I3std)]; ind = [1:3]; y(I1std) = nan; fprintf(' fprintf(' fprintf(' fprintf(' fprintf(' ------------------------------------ \n') Valores Desviacion estandar \n') ------------------------------------ \n') %2d %d-std, valor = %8.5f \n', [valores' ------------------------------------ \n') ind' desv']') Ejemplo 6.3: x = [1 2 4 8 9 6 2 1 2 3 1 5 4 4 8 2 5 61 2 0 32 6 0.95 0.3 0.1 14 10] ; valor = 2; switch valor case 1 matriz case 2 matriz case 3 matriz otherwise disp(' = [min(y) max(y) mean(x) std(x)]; = [min(y) max(y) mean(x) std(x)] .^2 ; = [cumsum(x)]; El valor no es 1 ,2 o 3') Página 15 return end resultado: matriz = 0.2048 41.2121 51.2815 156.4770 Ejemplo 6.4: x = [1 2 4 8 9 6 2 1 2 3 1 5 4 4 8 2 5 61 2 0 32 6 0.95 0.3 0.1 14 10]; y = x.*cos(pi*x/180) + 0.45253; n = length(x); i = 0; s = 0; m = 0; a = 0; str = 'la suma y la media acumulativa a'; while i < fix(n/2) i = i + 1; s = s + y(i); m = s / i; a = a + i; fprintf([ str ' i = %2d es = [%7.4f %7.4f] \n'],[i s m]) end resultado: la la la la la la la la la la la la la suma suma suma suma suma suma suma suma suma suma suma suma suma y y y y y y y y y y y y y la la la la la la la la la la la la la media media media media media media media media media media media media media acumulativa acumulativa acumulativa acumulativa acumulativa acumulativa acumulativa acumulativa acumulativa acumulativa acumulativa acumulativa acumulativa a a a a a a a a a a a a a i i i i i i i i i i i i i = = = = = = = = = = = = = 1 2 3 4 5 6 7 8 9 10 11 12 13 es es es es es es es es es es es es es = = = = = = = = = = = = = [ 1.4524 [ 3.9037 [ 8.3465 [16.7212 [26.0629 [32.4825 [34.9338 [36.3862 [38.8375 [42.2860 [43.7383 [49.1718 [53.6146 1.4524] 1.9518] 2.7822] 4.1803] 5.2126] 5.4138] 4.9905] 4.5483] 4.3153] 4.2286] 3.9762] 4.0977] 4.1242] 7.- Despliegue de datos con formatos Se pueden desplegar en pantalla mensajes o números con un determinado formato utilizando las funciones disp, fprintf. disp: Imprime texto y datos sin formato. Uso: disp (texto, vector o matriz). La impresión de texto se coloca entre apóstrofes. Ejemplo 7.1: Usando la matriz M del ejemplo de la sección 4 disp(' disp(' disp(' disp(' disp(M) Salida en pantalla de la matriz M') --------------------------------------------------------') Col1 Col2 Col3 Col4 Col5 Col6') --------------------------------------------------------') Salida en pantalla de la matriz M -------------------------------------------------------- Página 16 Col1 Col2 Col3 Col4 Col5 Col6 -------------------------------------------------------0.9501 0.4565 0.9218 0.4103 0.1389 0.0153 0.2311 0.0185 0.7382 0.8936 0.2028 0.7468 0.6068 0.8214 0.1763 0.0579 0.1987 0.4451 0.4860 0.4447 0.4057 0.3529 0.6038 0.9318 0.8913 0.6154 0.9355 0.8132 0.2722 0.4660 0.7621 0.7919 0.9169 0.0099 0.1988 0.4186 fprintf : Imprime texto, datos con formato. Además almacena datos en un archivo. Uso: fprintf(formato, texto, vector o matriz) Ejemplo 7.2: fprintf(' fprintf(' fprintf(' fprintf(' fprintf(' fprintf(' Salida en pantalla de la matriz M\n') -----------------------------------------------\n') Col1 Col2 Col3 Col4 Col5 Col6 \n') -----------------------------------------------\n') %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f\n',M') -----------------------------------------------\n') Salida en pantalla de la matriz M ----------------------------------------------Col1 Col2 Col3 Col4 Col5 Col6 ----------------------------------------------0.9501 0.4565 0.9218 0.4103 0.1389 0.0153 0.2311 0.0185 0.7382 0.8936 0.2028 0.7468 0.6068 0.8214 0.1763 0.0579 0.1987 0.4451 0.4860 0.4447 0.4057 0.3529 0.6038 0.9318 0.8913 0.6154 0.9355 0.8132 0.2722 0.4660 0.7621 0.7919 0.9169 0.0099 0.1988 0.4186 ----------------------------------------------- Nota: El formato %6.4f, significa que de los 6 espacios que esta ocupando la variable, cuatro son para los decimales y uno para la parte entera. El operador \n significa que se imprimirá una línea tras otra, si se omite este operador se imprimirá el resultado en una sola línea. Existe 4 formatos principales: %(n)d %(n)s %(m.n)f %(m.n)e = = = = salida salida salida salida de números enteros de cadena de caracteres (string) con punto flotante. exponencial. Ejemplo 7.3: fprintf(' fprintf(' fprintf(' fprintf(' El valor de pi es = %9.7f \n',pi) El valor de pi es = %9.7e \n',pi) La parte entera de pi es = %d \n',fix(pi)) Salida en pantalla de caracteres = %s \n','caracteres') El valor de pi es = 3.1415927 El valor de pi es = 3.1415927e+000 La parte entera de pi es = 3 Salida en pantalla de caracteres = caracteres Ejemplo 7.4: string = ' valor 1, valor 2, valor 3 es ='; formato = ' %5.3f, %4d, %3.2e '; operador = '\n'; vector = [7.24556 1256 5.36e-5]; fprintf([string formato operador ],vector(1),vector(2),vector(3)) Página 17 valor 1, valor 2, valor 3 es = 7.246, 1256, 5.36e-005 Nota: si se antepone fprintf('\n') imprimirá una línea en blanco. Ejemplo 7.5: fprintf(' %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f\n', ... M(1,:),M(2,:),M(3,:),M(4,:),M(5,:),M(6,:)) 0.9501 0.2311 0.6068 0.4860 0.8913 0.7621 0.4565 0.0185 0.8214 0.4447 0.6154 0.7919 0.9218 0.7382 0.1763 0.4057 0.9355 0.9169 0.4103 0.8936 0.0579 0.3529 0.8132 0.0099 0.1389 0.2028 0.1987 0.6038 0.2722 0.1988 0.0153 0.7468 0.4451 0.9318 0.4660 0.4186 Ejemplo 7.6: P = [1 5 10 15 30]'; T = [17.23 16.18 15.03 12.85 11.56]'; S = [34.454 34.441 34.353 34.230 34.222]'; ctd = [P T S]; fprintf(' Pres = %2d (db), Temp = %5.3f (ºC), Salt = %6.4f (psu)\n',ctd') Pres Pres Pres Pres Pres = 1 (db), Temp = 5 (db), Temp = 10 (db), Temp = 15 (db), Temp = 30 (db), Temp = = = = = 17.230 16.180 15.030 12.850 11.560 (ºC), (ºC), (ºC), (ºC), (ºC), Salt Salt Salt Salt Salt = = = = = 34.4540 34.4410 34.3530 34.2300 34.2220 (psu) (psu) (psu) (psu) (psu) 8.- Leer y guardar datos La función load y save permiten leer y guardar datos, respectivamente. Para leer los datos su estructura es: load nombre.extensión nombre_variable = load(nombre.extension); donde nombre = nombre del archivo, extensión = la extensión que tenga el archivo (.dat, .txt, etc.) La segunda opción el nombre se coloca entre apóstrofes, y los datos los asigna a la variable nombre_variable. Nota: El archivo de datos a leer, no debe contener comentarios sin el signo “ %”, además la matriz debe ser consistente, es decir, no puede faltar ningún dato en una fila o columna. Ejemplo 8.1: load estacion25.dat dat = load('estacion25.dat') El ejemplo anterior se ocupa cuando los datos están en el directorio de trabajo. Si los datos están en otro directorio, entonces su estructura es: load c:\carpeta1\carpeta2\........\nombre.extension. Página 18 load d:\carpeta1\carpeta2\........\nombre.extension. dat = load('c:\carpeta1\carpeta2\........\nombre.extension') dat = load('d:\carpeta1\carpeta2\........\nombre.extension') Ejemplo 8.2: load d:\ocefisica\datos\est_valparaíso.dat dat = load('d:\ocefisica\datos\est_valparaíso.dat') Por otro lado, para guardar datos su estructura es: save nombre variable1 variable2 … variable(n) save nombre.extension variables -ascii save nombre.extension variables -ascii -double save('nombre','variable 1','variable 2') save('nombre.extension','variable 1','variable 2','-ASCII') La primera opción, los datos se guardan en formato binario. La segunda opción, los datos se guardan en formato ASCII con 8 dígitos. La tercera opción, los datos se guardan en formato ASCII con 16 dígitos. Nota: No es aconsejable almacenar más de una variable en formato ASCII. También se pueden almacenar datos usando la función fprintf. fid = fopen(nombre_archivo.extension, 'w'); fprintf( fid, ' Formato \n', matriz, vector o texto); fclose(fid); donde fid es un identificador del fichero la opción 'w' significa 'write' formato (ver sección 6) fclose(fid), cierra el fichero. Ejemplo 8.3: P = [1 5 10 15 30]'; T = [17.23 16.18 15.03 12.85 11.56]'; S = [34.454 34.441 34.353 34.230 34.222]'; ctd = [P T S]; fid = fopen('datos_ctd.txt','w'); fprintf(fid,' %2d %5.3f %6.4f\n',ctd'); fclose(fid); genera el archivo de datos con el nombre datos_ctd.txt 1 5 10 15 30 17.230 16.180 15.030 12.850 11.560 34.4540 34.4410 34.3530 34.2300 34.2220 Ejemplo 8.4: index = [1:10]'; nombre = 'ejemplo_save.mat'; var_1 = rand(5); var_2 = sin(2*pi/425 * index) + 3*sin(2*pi/425 * index); Página 19 save(nombre,'var_1','var_2') save(nombre,'var_2','-ascii') Ejemplo 8.5: index = [1:10]'; nombre = 'ejemplo_save.mat'; var_1 = rand(5); var_2 = sin(2*pi/425 * index) + 3*sin(2*pi/425 * index); save ejemplo_save.mat var_1 var_2 save ejemplo_save.dat var_2 -ascii Ejemplo 8.6: Para leer los datos en archivo binario, se puede hacer de dos formas: load ejemplo_save.mat whos Name Size var_1 var_2 5x5 10x1 Bytes 200 80 Class double array double array Grand total is 35 elements using 280 bytes dat_1 = var_1 dat_2 = var_2 % Cambia el nombre de la variable. % lee los datos y los almacena en una estructura. % ------------------------------------------------var = load('ejemplo_save.mat'); var var = var_1: [5x5 double] var_2: [10x1 double] para recuperar las variables almacenadas: dat_1 = var.var_1 dat_2 = var.var_2 dat_1 = 0.3193 0.3749 0.8678 0.3722 0.0737 0.1998 0.0495 0.5667 0.1219 0.5221 0.1171 0.7699 0.3751 0.8234 0.0466 0.5979 0.9492 0.2888 0.8888 0.1016 0.0653 0.2343 0.9331 0.0631 0.2642 dat_2 = 0.0591 0.1183 0.1773 0.2364 0.2954 0.3544 0.4132 0.4720 0.5307 0.5892 Ejemplo 8.7 Lectura de datos ASCII con formato Página 20 fid = fopen(nm_file,'rt'); % Apertura del archivo str = fgetl(fid); %Lee una línea completa aa(1,1) =[sscanf(str(45:45+4),'%g',1)]; % extrae la información aa(1,2)=[sscanf(str(50:50+4),'%g',1)]; % extrae la información str = fgetl(fid); %lee la línea completa n = length(str); a = [sscanf(str(17:n),'%g',12)]'; % extrae la información fclose(fid); cierra el archivo Ejemplo 8.8 Lectura de datos ascii con formato en lenguaje estructurado file = 'g:\sam\TXT\cursos\ADG_513421\clase_01\ctd_test_01.cnv'; fid = fopen(file,'rt'); % Apertura del archivo % Lee los datos hasta el fin del archivo i1=1; while fid str = fgetl(fid); %lee la linea completa if ~isstr(str), break, end %termina cuando llega al fin de archivo i1 = i1+1; P(i1,:) =[str2num(str)]; end fclose(fid); Ejemplo 8.9 Lectura de archivos excel %[NUMERIC,TXT,RAW]=XLSREAD(FILE,SHEET,RANGE) [dat,tex,raw]=xlsread('datos_exel_01.xls'); [dat,tex,raw]=xlsread('datos_exel_01.xls','a12:x42'); s = xlsread('datos_exel_01.xls','a12:x42'); s = xlsread('datos_exel_02.xls','a12:x42'); Página 21 Página 22 9.- Gráficos Función Descripción plot bar hist feather loglog semilogx semilogy polar contour stem quiver quiver3 Grafico Grafico Grafica Grafica Grafica Grafica Grafica Grafica Grafica Grafica Muestra Muestra en dos dimensiones de barras histogramas diagrama de vectores con escalas logarítmicas en ambos ejes en escala logarítmica en el eje x en escala logarítmica en el eje y en coordenadas polares. contornos o isolineas. datos discretos vectores 2D especificados por las componentes (u,v) vectores 3D especificados por las componentes (u,v,w) Uso del PLOT: la función es la siguiente estructura: plot sirve para graficar figuras en escala lineal en ambos ejes. Su h = plot(x,y) h = plot(x1,y1,..,xn,ym) h = plot(x,y,'propiedad1',valor1,...,'propiedad(n)','valor(n)') donde x e y son las variables en los ejes X e Y. La propiedad puede ser, tipo de línea, tipo de marca, tamaño de la línea, marca o su color, etc. Las líneas y marcas pueden ser: Continua = Guiones = Punteada = Estrellas = Cruz = Guiones y puntos = -: * x -. Los colores pueden ser : b = azul r = rojo k = negro g = verde m = magenta y = amarillo c = turquesa w = blanco propiedad = 'linewidth',n propiedad = 'markersize',n linewidth: es la ancho de la línea y n es su valor. A mayor valor de n, mayor es el ancho de la línea. Página 23 Markersize: es el tamaño de la marca. A mayor valor de n, mayor es el tamaño de la marca. Nota. Para más información del estilo de las marcas use el help plot figure: Abre una ventana donde graficaran las figuras. H = figure(valor) H = figure('propiedad',valor, ..., 'propiedad(n),valor(n)) figure numero_figura subplot: Permite graficar varias figuras en una ventana. h = subplot(m,n,index) subplot m n index donde m = filas n = columans index = numero correlativo del gráfico. Total de figuras es m x n Ejemplo 9.1: subplot 331, significa 9 figuras agrupadas en 3 filas y 3 columnas Ejemplo 9.2 – Figura 1. t = 1:200; xt = sin(pi/20*t)+ 2*cos(2*pi/5*t) + 2*rand(1,t(end)); subplot 221 plot(t,xt,'k') subplot 222 plot(t,xt,'-r','linewidth',3) subplot 223 plot(t,xt,'x') subplot 224 plot(t,xt,'.','markersize',15) Página 24 Al gráfico trazado se puede agregar rótulos en el eje x como en el eje y, y titulo. Esto se hace de la siguiente forma: h = xlabel('texto','fontsize', n); h = ylabel('texto','fontsize', n); h = title('texto','fontsize', n); % agrega texto en el eje x. % agrega texto en el eje y, % agrega un titulo donde fontsize regula el tamaño del texto indicado por el número n. Además en el gráfico se pueden colocar tanto texto como una leyenda. Esto se hace: h = text(x,y,'texto'); h = text(x,y,'texto','fontsize',n,'Color','indicar color'); h = legend('texto 1','texto' , 'texto',....., 'texto n'); donde x e y son las posiciones en el eje-x y en el eje-y donde se colocará el texto. axis : Mofica los limites del gráfico. axis([ x_lim_inf x_lim_sup y_lim_inf y_lim_sup ]) axis square axis equal Ejemplo 9.3 – usando los datos del ejemplo 9.2 subplot 221 plot(t,xt,'k') ylabel('eje-y','fontsize',13) Página 25 title('Figura del subplot 221','fontsize',13) text(10,5, ' a )', 'fontsize',13) subplot 222 plot(t,xt,'-r','linewidth',3) title('Figura del subplot 222','fontsize',13) text(10,5, ' b )', 'fontsize',13) subplot 223 plot(t,xt,'x') xlabel('eje-x','fontsize',13) ylabel('eje-y','fontsize',13) title('Figura del subplot 223','fontsize',13) text(10,5, ' c )', 'fontsize',13) subplot 224 plot(t,xt,'.','markersize',15) xlabel('eje-x','fontsize',13) title('Figura del subplot 224','fontsize',13) text(10,5, ' d )', 'fontsize',13) set: Permite cambiar las propiedades a los objetos (del gráfico). set(gca, 'propiedad1 ', valor1,........, 'propiedad(n) ', valor(n)) set(handle, 'propiedad1 ', valor1, ........, 'propiedad(n) ', valor(n)) los más utilizados son: set(gca, 'xlim' , 'ylim' , 'xtick', 'ytick', [lim_inferior lim_superior], ... [lim_inferior lim_superior], ... [vector de valores],... [vector de valores],... Página 26 'xticklabel', [vector de caracteres en columna],... 'yticklabel', [vector de caracteres],... 'xgrid', ['on' ó 'off'],... 'ygrid', ['on' ó 'off'],... 'fontsize', [ ejemplo 9],... 'tickdir', ['in' ó 'out'],... 'ticklength', [valor1 valor2],... 'xcolor', ['k', 'w', 'b', etc],... 'ycolor', ['k', 'w', 'b', etc],... 'position', [borde, base, ancho, altura],.... 'xAxisLocation', ['top' ó 'bottom'],... 'yAxisLocation', ['left' ó 'right'],... 'xminortick', ['on' ó 'off'],... 'yminortick', ['on' ó 'off'],... 'box', ['on' ó 'off') 'on' : activa la propiedad. 'off' : desactiva la propiedad. get: Obtiene los valores asociado a cada propiedad. valor = get(handle, 'propiedad') Ejemplo 9.4 – Modificando las propiedades del grafico. figure('color','w') subplot 311 plot(t,xt) set(gca,'xlim',[1 240], ... 'xtick',[1 30:30:240],... 'ylim',[-3 5],... 'ytick',[-3:1:5],... 'tickdir','out',... 'ticklength',[0.009 0.025],... 'fontsize',8,.... 'ygrid','on',... 'xcolor','b',... 'ycolor','r') subplot 313 plot(t,xt) set(gca,'xlim',[1 240], 'xtick',[1 30:30:240],... 'ylim',[-3 5], 'ytick',[-3:1:5],... 'fontsize',8, 'xgrid','on',... 'xAxisLocation','top', 'yAxisLocation','right',... 'tickdir','out','box','off') Página 27 Ejemplo 9.5 – Grafico de vectores %Produce el campo de direcciones asociados al campo vectorial u=-y, v=x [x,y]=meshgrid(-2:0.1:2); u=-y;v=x; subplot 221; quiver(x,y,u,v) %Para obtener el campo de direcciones [x,y]=meshgrid(-2:0.5:2); u=-y;v=x; subplot 222; quiver(x,y,u,v,0) %para obtener el campo de direcciones reescalado [x,y]=meshgrid(-2:0.5:2); u=-y;v=x; subplot 223; quiver(x,y,u,v) [x,y] = meshgrid(-2:.2:2,-1:.15:1); z = x.*exp(-x.^2 - y.^2); [px,py] = gradient(z,.2,.15); subplot 224; contour(x,y,z), hold on quiver(x,y,px,py),hold off, axis image Página 28 10.- Interpolación La interpolación consiste en hallar un dato dentro de un intervalo en el que conocemos los valores en los extremos. Existen varios comandos para esto. Ejemplo 10.1 Interpolación de los NAN dm = find(isnan(vec) == 1); db = find(isnan(vec) == 0); yb = vec(db); y1 = interp1(db,yb,dm,'linear'); vec(dm) = y1 % % % % posiciones de los datos malos posiciones de los datos buenos corresponden a los datos buenos corresponden a los datos interpolados % datos interpolados ingresados a la vector original Ejemplo 10.2 Mínimos cuadrados, interpolación lineal y cúbica % Serie de datos x = [ 0 .1 .2 .3 .4 .5 .6 .7 .8 .9 1 ]; y = [ 0.09 .12 .24 .27 .4 .45 .61 .67 .71 .63 .59]; % n f p Interpolación por Minimos cuadrados = 5; %Aproximación orden 5 = linspace(0, 1, 100); % Formamos una serie de puntos para graficar. = polyfit(x,y,n) % Crea los elementos del polinomio que hará la interpolación. % El polinomio es del tipo ax5 + bx4 + cx3 + dx2 + ex + f = 0 z1 = polyval(p,f); % Evaluación polinomial. plot(x,y,'*',f,z,':') % Hacemos la gráfica de la interpolación % Interpolación lineal z2=interp1(x,y,f); plot(x,y,'*',f,z2); % Interpolación cúbica z3=spline(x,y,f); plot(x,y,'*',f,z3); 11.- Funciones de usuario. Estructura: function function function [valores de retorno] = nombre_funcion ( valores de entrada ) nombre_funcion ( valores de entrada ) nombre_funcion Los valores tanto de entrada como de retorno deben estar separados por comas. La función se almacena con extensión (.m). Estructura de una función function [v1,..,vn] = nombre_funcion (x1,…,xn) % comentarios nargin % opcional Sentencias Return Página 29 Uso del nargin: El nargin es útil cuando se trabaja con valores opcionales. Ejemplo 11.1 function str = caracteres(mes,opt) % Toma la opcion por defecto % --------------------------if nargin == 1 opt = 'reducido' end if opt == 'reducido' meses = ['E';'F';'M';'A';'M';'J';'J';'A';'S';'O';'N';'D']; str = meses(mes); elseif opt == 'completo' meses = ['Ene';'Fre';'Mar';'Abr';'May';'Jun';'Jul'; 'Ago';'Sep';'Oct';'Nov';'Dic']; str = meses(mes,:); end Uso de la funcion: clear all, clc numero_mes = 6; % Mes de Junio opt = 'completo'; valor_mes = caracteres(numero_mes,opt) Ejemplo 11.2: function [media, desv, r] = estadistica_basica(u, v) % % % % % % % % % ---------------------------------------------------------calcula la media, desviación estandar y el coeficiente de correlacion para los vectores u y v. Se asume que los vectores no tienen datos NAN. media = [media_u media_v]; desv = [desv_std_u desv_std_u]; r = coeficiente de correlacion lineal. ---------------------------------------------------------- u = u(:); v = v(:); mat = [u v]; media = mean(mat); covar = cov(mat); stdu = covar(1); stdv = covar(4); covm = covar(3); desv = [stdu stdv]; r = covm/sqrt(stdu*stdv); Página 30 return Uso de la function: clear all, clc x = [1 2 4 8 9 6 2 1 2 3 1 5 4 4 8 2 5 61 2 0 32 6 0.95 0.3 0.1 14 10]; y = x.*cos(pi*x/180) + 0.45253; [media, desv, r] = estadistica_basica(x, y) media = 7.1611 6.2334 desv = 156.4770 53.7056 r = 0.9450 Ejemplo 11.3: function grafica(y) % ----------------------------------------------% Grafica el vector y, utilizando una linea roja % ----------------------------------------------plot(y,'r') Uso de la function: clear all, clc t = 0:0.1:10; y = 2*sin(t); grafica(y) Página 31 ANEXO: Toolbox útiles Análisis de datos y transformada de Fourier Análisis estadístico Análisis de señales Análisis de wavelet Funciones especiales Funciones matriciales Gráficos : : : : : : : Interpolación y polinomios Interpolación spline Integrales y ecuaciones diferenciales Información general Manejo de string Manejo de archivos Mapas Modelos : : : : : : : : datafun stats signal wavelet specfun matfun, elmat , sparfun graph2d , graph3d, specgraph, graphics polyfun splines funfun general strfun iofun map, mapproj simulink help stats Statistics Toolbox Distributions Parameter estimation betafit - Beta parameter estimation binofit - Binomial parameter estimation expfit - Exponential parameter estimation gamfit - Gamma parameter estimation mle - Maximum likelihood estimation (MLE) normfit - Normal parameter estimation poissfit - Poisson parameter estimation raylfit - Rayleigh parameter estimation unifit - Uniform parameter estimation weibfit - Weibull parameter estimation Probability density functions (pdf) betapdf - Beta density binopdf - Binomial density chi2pdf - Chi square density Hypothesis Tests. ranksum signrank signtest ztest ttest ttest2 - Wilcoxon rank sum test (independent samples) Wilcoxon sign rank test (paired samples) Sign test (paired samples) Z test One sample t test Two sample t test Distribution Testing jbtest - Jarque-Bera test of normality kstest - Kolmogorov-Smirnov test for one sample kstest2 - Kolmogorov-Smirnov test for two samples lillietest - Lilliefors test of normality Página 32