Funciones Básicas MATLAB tiene un gran número de funciones incorporadas. Algunas son funciones intrínsecas, esto es, funciones incorporadas en el propio i código ódi ejecutable j t bl d l programa. Estas del E t f funciones i son particularmente rápidas y eficientes. Existen además funciones definidas en ficheros *.m * m y *.mex12 * mex12 que vienen con el propio programa o que han sido aportadas por usuarios del mismo. Estas funciones extienden en gran manera las posibilidades del programa MATLAB dispone también de ficheros *.p, que son los ficheros *.m precompilados con la función pcode. pcode Para que MATLAB encuentre una determinada función de usuario el correspondiente fichero fichero-M M debe estar en el directorio actual o en uno de los directorios del search path. Características generales de las funciones de MATLAB El concepto de función en MATLAB es semejante al de C y al de otros lenguajes de programación, aunque con algunas diferencias importantes. Al igual que en C, una función tiene nombre, valor de retorno y argumentos. function (y,w) = fact(x,z) output argument input argument function name Una función se llama utilizando su nombre en una expresión o utilizándolo como un comando más. Las funciones se definen en ficheros de texto *.m en la forma que se verá más adelante. Los valores de retorno son el resultado de la función y sustituyen y a ésta en la expresión donde la función aparece Los argumentos de cada función van a continuación del nombre entre paréntesis (y separados por comas si hay más de uno).. En MATLAB las funciones pueden tener valores de retorno matriciales múltiples; los valores de retorno se recogen entre corchetes, separados por comas Características generales de las funciones de MATLAB Una característica de MATLAB es que las funciones que no tienen argumentos no llevan paréntesis Los L nombres b d las de l funciones f i d MATLAB no son palabras de l b reservadas d d l del lenguaje Es posible crear una variable llamada sin o cos cos,, que ocultan las funciones correspondientes.. correspondientes Para poder acceder a las funciones hay que eliminar (clear clear)) las variables del mismo i nombre b que llas ocultan, lt o bien bi h b haber d fi id previamente definido i t una referencia a función (function handle) handle). MATLAB permite que una función tenga un número de argumentos de entrada y valores de retorno, variables; determinado sólo en tiempo de ejecución. Diversos tipos de funciones en MATLAB 1.- Funciones matemáticas elementales. 2.- Funciones especiales. 3.- Funciones matriciales elementales. 4.- Funciones matriciales específicas. 5 - Funciones para la descomposición y/o factorización de matrices 5. matrices. 6.- Funciones para análisis estadístico de datos. 7.- Funciones para análisis de polinomios. 8 Funciones 8.F i para integración i t ió de d ecuaciones i diferenciales dif i l ordinarias. di i 9.- Resolución de ecuaciones no-lineales y optimización. 10.- Integración numérica. 11.- Funciones para procesamiento de señal.. 12.-- Funciones definidas por el usuario 12. Funciones matemáticas elementales Estas funciones, comprenden las funciones matemáticas trascendentales y otras funciones básicas Cuando se aplican a una matriz actúan sobre cada elemento de la matriz como si se tratase de un escalar. escalar Por tanto, se aplican de la misma forma a escalares, vectores y matrices. Algunas de las funciones de este grupo son las siguientes: seno cos(x) coseno tan(x) tangente asin(x) arco seno acos(x) arco coseno atan(x) arco tangente (devuelve un ángulo entre -π/2 π/2 y +π/2) atan2(x) arco tangente (devuelve un ángulo entre -π y +π) sinh(x) seno hiperbólico cosh(x) coseno hiperbólico tanh(x) tangente hiperbólica A Argumento s en radia anes sin(x) asinh(x) arco seno hiperbólico acosh(x) arco coseno hiperbólico atanh(x) arco tangente hiperbólica log(x) logaritmo natural log10(x) logaritmo decimal exp(x) p( ) función exponencial p sqrt(x) raíz cuadrada sign(x) devuelve -1 si <0, 0 si =0 y 1 si >0. Aplicada a un número complejo, devuelve un vector unitario en la misma dirección rem(x,y) resto de la división (los argumentos no tienen que ser enteros) mod(x,y) similar a rem (Ver diferencias con el Help) round(x) redondeo hacia el entero más próximo fix(x) redondea hacia el entero más próximo a 0 floor(x) valor entero más próximo hacia -∞ ceil(x) valor entero más próximo hacia +∞ gcd(x) máximo común divisor lcm(x) mínimo común múltiplo real(x) partes reales imag(x) partes imaginarias abs(x) valores absolutos angle(x) ángulos de fase: Funciones que actúan sobre vectores Las siguientes funciones sólo actúan sobre vectores (no sobre matrices, ni sobre escalares) l ): [xm,im]=max(x) máximo elemento de un vector. Devuelve el valor máximo min(x) sum(x) cumsum(x) mean(x) std(x) prod(x) cumprod(x) [y,i]=sort(x) xm y la p posición q que ocupa p im mínimo elemento de un vector. Devuelve el valor mínimo y la posición que ocupa. suma de los elementos de un vector. devuelve el vector suma acumulativa de los elementos de un vector (cada elemento del resultado es una suma de elementos del original). valor medio de los elementos de un vector desviación típica producto de los elementos de un vector devuelve el vector producto acumulativo de los elementos de un vector Ordena de menor a mayor los elementos de un vector x. Devuelve el vector ordenado y, y y un vector i con las posiciones iniciales en x de los elementos en el vector ordenado y. Funciones que actúan sobre matrices Las siguientes funciones exigen que el/los argumento/s sean matrices. En este grupo aparecen algunas de las funciones más útiles y potentes de MATLAB. Se clasifican en varios subgrupos : FUNCIONES MATRICIALES ELEMENTALES : calcula la traspuesta (conjugada) de la matriz A B = A.' calcula la traspuesta (sin conjugar) de la matriz A v = poly(A) poly p y((A)) y( devuelve un vector v con los coeficientes del p polinomio característico de la matriz cuadrada A t = trace(A) devuelve la traza t (suma de los elementos de la diagonal) de una matriz cuadrada A [m,n m,n]] = size(A) size(A) devuelve el número de filas m y de columnas n de una matriz rectangular A n = size(A) size(A) devuelve el tamaño de una matriz cuadrada A nf = size(A,1) size(A,1) devuelve el número de filas de A nc = size(A,2) size(A,2) devuelve el número de columnas de A B = A' Blkdiag (a,b,c,d,...) Construct block diagonal matrix from input arguments diag diag(v) (v) Diagonal matrices and diagonals of matrix eye (n) Identity matrix f freqspace Frequency spacing for f frequency f response Ind2sub(A) Subscripts from linear index linspace linspace((a,b,n a,b,n)) Generate linearly spaced vectors logspace Generate logarithmically spaced vectors meshgrid Generate X and Y arrays for 3-D plots ndgrid Generate arrays for N-D functions and interpolation ones Create array of all ones rand Uniformly distributed pseudorandom numbers randn Normally distributed random numbers sub2ind Single index from subscripts zeros Create array of all zeros accumarray Construct array with accumulation arrayfun Apply function to each element of array bsxfun Apply element-by-element binary operation to two arrays with singleton expansion enabled cast Cast variable to different data type cross ross Vector cross product cumprod Cumulative product cumsum Cumulative sum dot Vector dot product idi id idivide I t Integer di i i with division ith rounding di option ti kron Kronecker tensor product prod p Product of arrayy elements sum Sum of array elements tril Lower triangular part of matrix triu Upper triangular part of matrix Manipulación de arreglos blkdiag Construct block diagonal matrix from input arguments cat Concatenate arrays along specified dimension diag Diagonal matrices and diagonals of matrix end Terminate block of code, code or indicate last array index flipdim Flip array along specified dimension (intercambio, volteo) fliplr Flip matrix left to right flipud Flip matrix up to down horzcat Concatenate arrays horizontally inline Construct inline object (ejemplo, g = inline('t^2')) == g(t) = t^2) ipermute Inverse permute dimensions of N-D array permute Rearrange dimensions of N-D N D array reshape Reshape array rot90 Rotate matrix 90 degrees sort Sort array elements in ascending or descending order sortrows Sort rows in ascending order squeeze Remove singleton dimensions, Ejemplo A=rand(2,1,3); B=squeeze(A) vectorize Vectorize expression p vertcat Concatenate arrays vertically Marices especializadas compan Companion matrix gallery Test matrices hankel Hankel matrix hilb Hilbert matrix invhilb Inverse of Hilbert matrix magic Magic square pascal Pascal matrix rosser Classic symmetric eigenvalue test problem vander Vandermonde matrix FUNCIONES MATRICIALES ESPECIALES : Las funciones exp(), exp() sqrt() y log() se aplican elemento a elemento a las matrices y/o vectores que se les pasan como argumentos. Existen otras funciones similares que tienen también sentido cuando se aplican a una matriz como una única entidad. Estas funciones son las siguientes g ((se distinguen porque llevan una "m" adicional en el nombre): expm(A) sqrtm(A) logm() matriz exponencial si A=XDX', expm(A) = X*diag(exp(diag(D)))*X' devuelve una matriz que multiplicada por sí misma da la matriz A es la función recíproca de expm(A) Aunque no pertenece a esta familia de funciones, se puede considerar que el operador potencia (^) está emparentado con ellas. Así, es posible decir que: A^n está definida si A es cuadrada y n un número real. Si n es entero, el resultado se calcula por multiplicaciones sucesivas. Si n es real, el resultado se calcula como: A^n=X*D.^n*X' siendo [X,D]=eig(A) FUNCIONES DE FACTORIZACIÓN Y/O DESCOMPOSICIÓN MATRICIAL descomposición de Crout (A = LU) de una matriz matriz. B = inv(A) calcula la inversa de A. Equivale a B=inv(U)*inv(L) d = det(A) devuelve el determinante d de la matriz cuadrada A. E = rref(A) reducción a forma de escalón (mediante la eliminación de Gauss con pivotamiento por columnas, haciendo ceros también encima de los pivotes) de una matriz rectangular A [[E,xc] , ] = rref(A) ( ) reducción a forma de escalón con un vector xc q que da información sobre una posible base del espacio de columnas de A U = chol(A) descomposición de Cholesky de matriz simétrica y positivodefinida. c = rcond(A) devuelve una estimación del recíproco de la condición numérica de la matriz A basada en la norma-1. Si el resultado es próximo a 1 la matriz A está bien condicionada; si es próximo a 0 no lo está. [X,D] [X D] =eig(A) valores propios (diagonal de D) y vectores propios (columnas de X) de una matriz cuadrada A. [X,D] = eig(A,B) valores propios (diagonal de D) y vectores propios (columnas de X) de dos matrices cuadradas A y B (Ax = λBx). [L,U] [L U] = lu(A) FUNCIONES DE FACTORIZACIÓN Y/O DESCOMPOSICIÓN MATRICIAL [Q,R] [Q R] = qr(A) descomposición QR de una matriz rectangular rectangular. [Q,R] = qr(A,0) similar a la anterior, pero con Q del mismo tamaño que A, es decir, sin completar una base ortonormal cuando m>n. [Q,R,E] [Q R E]=qr(A) qr(A) factorización QR con pivotamiento por columnas columnas. La matriz E es una matriz de permutación tal que A*E=Q*R. La matriz E se determina de modo que los elementos de abs(diag(R)) son decrecientes. B = null(A) devuelve una base ortonormal del subespacio nulo (kernel, o conjunto de vectores x tales que Ax = 0) de la matriz rectangular A, calculada mediante la descomposición de valores singulares. Las columnas de B son ortonormales: B B'*B=I B=I. B = null(A,'r') devuelve una base del subespaco nulo de A calculada a partir de la forma de escalón reducida. Las columnas de B no son ortonormales y se obtienen alternativamente dando valor cero a todas las variables libres excepto a una a la que se da valor unidad. Q = orth(A) las columnas de Q son una base ortonormal del espacio de columnas de A. El número de columnas de Q es el rango de A. Lectura y escritura interactiva de variables Una forma sencilla de leer variables desde teclado y escribir mensajes j en la pantalla del PC, utilizando la función input y disp disp.. FUNCIÓN INPUT La función input permite imprimir un mensaje en la línea de comandos de MATLAB y recuperar como valor de retorno un valor numérico o el resultado de una expresión tecleada por el usuario. Sintaxis, n = input( input('Teclee Teclee el número de ecuaciones'); ecuaciones ); “ Da al usuario el mensaje en la cadena de texto y luego espera la entrada de datos desde el teclado”. teclado”. n = input('Teclee p ( el número de ecuaciones'); ); Otra forma de esta función es la siguiente (obsérvese el parámetro 's'): >> nombre = input('¿Cómo te llamas?','s‘) llamas?','s‘) FUNCIÓN DISP La función disp permite imprimir en pantalla un mensaje de texto o el valor de una matriz, pero sin imprimir su nombre. •Sintaxis disp(X) muestra la matriz X, sin imprimir el nombre Ejemplo >> disp('El disp('El programa ha terminado') >> A=rand(4,4); >> disp(A) disp(A) Entrada y salida de datos Ya se ha visto una forma de realizar la entrada interactiva de datos por medio de la función input resultados p por medio de la función disp disp. p y de imprimir p p. Sin embargo, MATLAB permite intercambiar datos con otras aplicaciones. IMPORTAR DATOS DE OTRAS APLICACIONES Hay varias formas de utilizar los datos de otras aplicaciones –por ejemplo de Excel– Excel – a MATLAB. Se pueden utilizar las siguientes formas: 1. Se puede utilizar el Copy y Paste para copiar datos de la aplicación original y depositarlos entre los corchetes de una matriz o vector, en una línea de comandos de MATLAB MATLAB. Ejemplo: 1 >> A=[4.13941637 1. A=[ A=[4 13941637 0 0.43516229 43516229 -14 14.3809959 3809959 -2 2.22223589 22223589 4 4.16091156 16091156 0.2544432 -15.2615586 -3.22785872 4.30758208 0.26416528 -14.5116303 2.07436909 2.25581395 0.29069767 -16.3959466 -2.42359637 2.3372093 0.6627907 -15.6547363 -2.55371351 2.43881602 1.41382517 -9.87890616 6.84187243 2.50674757 0.75901242 -15.6607725 -3.02085084 2.73618317 3.61627907 -14.298507 -5.59203684] Archivos del alumno. IMPORTAR DATOS DE OTRAS APLICACIONES 1. Se puede crear un fichero *.m con un editor de textos, con lo cual no existen problemas de edición. 2. Se puede leer un flat file escrito con caracteres ASCII. Un flat file es un fichero con filas de longitud constante separadas con Intro Intro,, y varios datos (columnas ) por fila fil separados d por blancos bl ((espacios). (espacios) i ). 3. MATLAB lee este tipo de archivos con el comando load load.. Sintaxis load filename Este comando recupera todas las variables de un archivo determinado, de una ruta t completa l t o ruta t relativa l ti parcial i ld de MATLABPATH. MATLABPATH Si filename no tiene extensión, load busca FILENAME.mat y si la encuentra, load trata el archivo como un archivo binario MAT, “FILENAME.mat”. Si no se encuentra, o si el nombre del archivo tiene una extensión distinta a .mat, el archivo se considera como un archivo ASCII. IMPORTAR DATOS DE OTRAS APLICACIONES 1. También se puede importar datos desde un archivo del tipo texto es decir con extensión .txt. txt. Para cargar un archivo de este tipo, se ejecuta l d datos.txt load d t t t ell contenido t id d dell flat fl t file fil se almacena l en una matriz t i con el nombre datos datos.. Por ejemplo, ejemplo crear un fichero llamado flat.txt flat txt que contenga las líneas: 23.456_56.032_67.802 3.749 _ _--98.906_34.910 >>A=load('flat.txt') leerá estos valores y los asignará a la matriz A. IMPORTAR DATOS DE OTRAS APLICACIONES Otro comando es textread textread,, este p permite leer datos de cualquier q tipo, p siempre y cuando estén en formato de texto. Sintaxis A = TEXTREAD TEXTREAD('FILENAME') ('FILENAME') A = TEXTREAD TEXTREAD(' ('FILENAME','',N FILENAME','',N)) A = TEXTREAD TEXTREAD(' ('FILENAME' ('FILENAME','',param,value FILENAME' '' FILENAME','',param,value, l , ...)) A = TEXTREAD TEXTREAD(' ('FILENAME','',N,param,value FILENAME','',N,param,value,, ...) El comandos lee los datos numéricos del archivo de nombre FILENAME. Si el archivo contiene datos de texto, se produce un error.. [A,B,C, A,B,C, ...] = TEXTREAD TEXTREAD(' ('FILENAME','FORMAT FILENAME','FORMAT') ') [A,B,C A,B,C,, ...] = TEXTREAD TEXTREAD(' ('FILENAME','FORMAT',N FILENAME','FORMAT',N)) [A,B,C, A,B,C, ...] = TEXTREAD TEXTREAD(' ('FILENAME','FORMAT',param,value FILENAME','FORMAT',param,value,, ...) [A,B,C, A,B,C, ...] = TEXTREAD TEXTREAD(' ('FILENAME','FORMAT',N,param,value FILENAME','FORMAT',N,param,value,, ...) >> Help textread textread.. – IMPORTAR DATOS DE OTRAS APLICACIONES T bié se pueden También d lleer d datos t d de un fifichero h con llas ffunciones i f fopen y fread f d También se pueden leer datos de hojas de cálculo por ejemplo de Excel, para ello se utiliza el comando xlsread xlsread.. El comando p permite obtener datos y el texto de una hoja de calculo de un libor de excel Sintaxis [NUMERIC,TXT,RAW]=xlsread(FILE) Lee los datos especificados en el archivo de Excel (FILE (FILE). ). Las celdas con datos numéricos en FILE se devuelven NUMERIC NUMERIC,, las celdas de texto en FILE se devuelven en TXT TXT,, y las celdas sin transformar (no son ni texto ni numericas se devuelven en RAW. RAW. [NUMERIC,TXT,RAW]=XLSREAD(FILE,SHEET,RANGE) Aquí se lee una hoja especifica y un rango especifico FORMAS DE USO DEL COMANDO NUMERIC = xlsread(FILE); [NUMERIC,TXT]=xlsread(FILE); [NUMERIC,TXT,RAW]=xlsread(FILE); IMPORTAR DATOS DE OTRAS APLICACIONES También se pueden leer imágenes y almacenarlas en una variable. El comando para leer imágenes es imread Sintaxis A = imread( imread(filename,FMT filename,FMT)) La cadena de texto FMT, especifica el formato del archivo, que se identifica por su extensión de archivo estándar. Por ejemplo, "gif“, “bmp”, etc. Para ver una lista de formatos soportados, con sus extensiones de archivo, utilice l ffunción la ió imformats. i f t ALMACENAMIENTO DE DATOS EN OTRAS APLICACIONES MATLAB permite almacenar datos en archivos con extencion mat mat,, m, txt y xls entre otras. Para el almacenamiento de datos con extensión xls para su uso en Excel, se utiliza el comando xlswrite xlswrite.. El cual graba una matriz X en un archivo de Excel (archivo .xls .xls)) Sintaxis xlswrite('filename', xlswrite ('filename', M (array), sheet, 'range') Ejemplos Ejemplo 1, Escribir un grupo de datos números en una hoja de calculo de Excel xlswrite(‘prueba', xlswrite( xlswrite ((‘prueba', prueba , [1 2 3 4 5 6 7 8 9 10]) A = xlsread(‘prueba.xls', xlsread(‘prueba.xls', ‘datos ‘datos’) ’) A = xlsread xlsread( ( prueba.xls datos ,'A1:B10') A1:B10 ) xlsread('prueba ('prueba xls', 'datos' xlswrite('prueba.xls', A,'datos','e10:f20') xlswrite('prueba.xls', xlswrite('prueba ('prueba xls', A, A 'datos' xlswrite( xlswrite ( prueba.xls datos ,'e10:f20') e10:f20 ) Ejemplo 2, crear el siguiente arreglo. d = {'Time', 'Temp'; 12 98; 13 99; 14 97}; s = xlswrite('tempdata.xls', d, 'Temperatura', 'E1') Añadir una hoja a un libro creado xlswrite('tempdata.xls', d, 'NewTemp', 'E1') EXPORTAR DATOS DE TEXTO También existen funciones de MATLAB para exportar datos en varios formatos comunes de ASCII. Por ejemplo, ejemplo puede utilizar estas funciones para exportar una matriz de MATLAB como un archivo de texto donde los valores numéricos de las filas y las columnas estén separadas por un espacio. La función que se utiliza depende de la cantidad de datos que desea exportar y su formato. FORMATOS DE ARCHIVO DE DATOS ASCII Exportación de archivos de datos ASCII delimitados Para exportar un arreglo o una serie de datos como un archivo ASCII delimitado, se utiliza la función de save, especificando la clasificación -ASCII, o la función dlmwrite. La función save es fácil de usar, sin embargo, la función dlmwrite proporciona más flexibilidad que le permite especificar cualquier carácter como delimitador flexibilidad, delimitador, y se pueden exportar los subconjuntos de un arreglo, especificando un rango de valores. EJEMPLO Utilizando Función save >> A = [ 1 2 3 4 ; 5 6 7 8 ]; >> save my_data.txt A –ASCII Función archivo Formato De forma predeterminada, save utiliza los espacios como delimitadores, pero se puede usar tabs en lugar de espacios, especificando la opción -tabs tabs.. >> save my_data.txt A –ASCII -tabs También se p puede g grabar una cadena de caracteres , sin embargo g se almacena el equivalente al código ASCII >> s='hola s='hola'' >> save my_data.txt my data.txt s -ASCII Utilizando Función dlmwrite Para exportar p una matriz en formato ASCII, y especificar p el delimitador usado en el archivo, se utiliza la función dlmwrite >> A = [ 1 2 3 4 ; 5 6 7 8 ]; >> dlmwrite ('my_data1.txt', A ,'; ,';') Función archivo Arreglo Delimitador Utilizando Función diary Para exportar pequeñas matrices numéricas o celdas de matrices, se puede utilizar diary. y crea una copia p literal de la sesión de MATLAB en un archivo en el la función diary disco (excepto los gráficos). Sintaxis de la función diary diary diary('filename') diary off diary on diary filename ejemplo >> A = [ 1 2 3 4 ; 5 6 7 8 ]; Para exportar esta matriz mediante diary diary, es necesario ejecutar estos comandos en el prompt de MATLAB MATLAB. 1.- Encender la función diary diary. Es opcional nombrar el archivo de salida utilizando diary diary. >> diary di d t dt t datosd.txt 2.- Mostrar el contenido del arreglo (matriz) a exportar >> A 3.-- Desactivar la función diary 3. >> diary off IMPORTAR DATOS DE TEXTO FUNCIONES dlmread type Sintaxis Muestra el contenido del archivo M = dlmread(filename) M = dlmread(filename, dlmread(filename delimiter) M = dlmread(filename, delimiter, R, C) M = dlmread(filename, delimiter, range) Sintaxis type('filename') type filename Sintaxis de las funciones Sintaxis de la función save Sintaxis de la función dlmwrite save save filename save filename content save filename options save filename content options save('filename', 'var1', 'var2', ...) dlmwrite(filename, dl it (fil M) dlmwrite(filename, M, 'D') dlmwrite(filename, M, 'D', R, C) dlmwrite(filename, M, 'attrib1', value1, 'attrib2', value2, ...) dl dlmwrite(filename, it (fil M '-append') M, ' d') dlmwrite(filename, M, '-append', attribute-value list) Ejemplo 1 : >> p = rand(1, 10); >> q = ones(10); >>save test.mat Ejemplo 1 : >>M rand(4) >>M= rand(4); >> dlmwrite('archivoM.txt', M, 'delimiter', '\t', ... 'precision', 6) >> type archivoM.txt Ejemplo 2 >>savefile = 'test.mat'; >>p = rand(1, 10); >>q = ones(10); >>save(savefile, 'p', 'q') Ejemplo 3 >>save('C:\alumnos\maestria\ejercic ios curso\feb10.txt', 'p','q','-ASCII') >>type feb10.txt Ejemplo 2 >>dlmwrite('archivoM.txt', M, 'precision', '%.6f', ... 'newline' 'pc') 'newline', >> dlmread archivoM.txt Ejemplo 3 >> dlmwrite('archivoM.txt', [M*5 M/5], ' ') >> dlmwrite('myfile.txt', rand(3), '-append', ... 'roffset', 1, 'delimiter', ' ‘)