Escolar Documentos
Profissional Documentos
Cultura Documentos
INTRODUCCIN
Con este manual pretendemos iniciar al lector en el sistema interactivo MATLAB; un
sistema basado en matrices (MATLAB proviene de MATrix LABoratory) para
clculos cientficos y de ingeniera. Una de sus caractersticas ms atractivas es la
posibilidad de resolver problemas de cierta envergadura mediante pocas instrucciones,
frente a otros programas en los que seran necesarios pginas enteras de cdigo. Como
ventaja adicional el trabajar con matrices har que nuestras instrucciones sean en su
mayora fciles de comprender.
Nuestra intencin al redactar este documento es ayudar a todo aquel que quiera
iniciarse en MATLAB y recomendamos que se utilice el ordenador mientras se lee,
experimentando libremente con los ejemplos que aqu se proporcionan. Si adems el
lector intuye algo que aqu no se explica le animamos a que lo intente pues en
MATLAB la lgica funciona bastante bien.
Es deseable que el lector posea algunas nociones de programacin y est
familiarizado con algn lenguaje (ya sea C, FORTRAN, Pascal ...) pues en este manual
utilizaremos algunos conceptos, como los bucles, que son propios de la programacin.
Por ltimo y antes de entrar en materia sealar que la potencia de MATLAB va ms
all de lo que podemos ver en este manual introductorio. Para una informacin ms
detallada recomendamos que se consulte la gua del usuario y la de referencia.
El autor
NDICE
DEFINIENDO MATRICES............................................................................................................. 9
2.1
2.2
2.3
2.4
2.5
9
LOCALIZACIN Y LISTADO DE DIRECTORIOS, ARCHIVOS Y FUNCIONES:
ALGUNOS COMANDOS TILES. ....................................................................................................... 28
10
11
12
EL OPERADOR !. .......................................................................................................................... 36
13
14
16
HARDCOPY. .................................................................................................................................. 39
17
GRFICOS. .................................................................................................................................... 39
17.1
17.2
17.3
17.4
18
1 Nociones bsicas.
1.1 El uso de la ayuda en MATLAB.
Al igual que otros programas MATLAB dispone de una ayuda. Si tecleamos en
cualquier momento la instruccin
help
y a continuacin pulsa INTRO obtendr ayuda sobre la funcin isempty, que determina
si una matriz est vaca o no (comprobar el lector ms adelante lo til que resulta).
Podemos acceder a algunas demostraciones que nos pueden ayudar a hacernos una idea
de la gran cantidad de posibilidades que nos ofrece el programa mediante la instruccin
demo
En la versin 5.0 se han incluido dos herramientas nuevas de ayuda a disposicin del
usuario. La primera de ellas es el
helpwin
con la que se nos abre una ventana de ayuda en la que podremos investigar sobre el
tema que nos interese. La otra es un manual detallado al que podemos acceder, teniendo
abierto un navegador de internet, a travs de
helpdesk
b=(a+2)*a-4*(a+3)
y deseamos ver cmo vara el valor de b para diferentes valores de a slo tenemos que
recuperar el comando usando el cursor, modificar el valor de a y ejecutarlo de nuevo.
1.3 Declaraciones, expresiones y variables.
Dado que MATLAB es un lenguaje interpretado comenzaremos hablando de
expresiones.
Supongamos que nos interesa obtener el valor de multiplicar 2 por 3; tenemos dos
formas de hacerlo segn el uso que queramos darle al resultado de la multiplicacin. La
primera de ellas es
2*3
asignando el resultado de la expresin (6) a una variable por defecto llamada ans (por
answer). Si lo que queremos es almacenar el resultado de la multiplicacin en una
variable para poder usarla ms tarde entonces usaremos una segunda forma:
a=2*3
se obtiene la respuesta
Si lo que queremos es escribir varias instrucciones en una misma lnea podemos hacerlo
separndolas por comas o puntos y comas, esto es:
c = a , b =4*27
Si no deseamos que el resultado de una operacin se muestre por pantalla (para obviar
resultados intiles) basta con aadir un punto y coma al final de la instruccin. As, con
la instruccin
w = 2+3*4;
(respuesta de MATLAB)
C=A+2
C=22
(respuesta de MATLAB)
c=A*3;
who
Your variables are:
A
C
clear A
whos
Name
Size
C
c
1x1
1x1
Bytes
8
8
Class
double array
double array
2 Definiendo matrices.
Como ya hemos dicho anteriormente, MATLAB trabaja esencialmente con matrices y
todas nuestras variables sern consideradas por l como tales. Hay diferentes formas
para introducir una matriz en MATLAB:
2.1 Elemento a elemento.
En esta primera forma de introducir matrices lo que haremos ser enumerar uno a uno
los elementos que compondrn la matriz, siguiendo un par de reglas. As, con las
declaraciones
A= [1 2 4; 8 16 32; 64 128 256]
A = [
1 2 4
8 16 32
64 128 256 ]
Si queremos definir una matriz como una matriz vaca (que posteriormente podremos ir
llenando) lo podemos hacer escribiendo:
Matriz=[]
matriz de ceros
matriz de unos
matriz identidad
(explicada a continuacin)
(explicada a continuacin)
parte triangular inferior de una matriz
parte triangular superior de una matriz
matriz de Hilbert
matriz mgica
matriz de Toeplitz (ver help toeplitz)
matriz de Vandermonde (ver help vander)
Segn queramos producir una matriz cuadrada o no as llamaremos a la funcin. Si, por
ejemplo, escribimos:
ones(m,n);
1
1
[m,n]=size(z)
m = 2
n = 3
es una matriz diagonal, cuya diagonal principal son los elementos de x. De esta forma,
diag(diag(B));
1
5
9
6
7
2
10
Por otra parte, mediante la instruccin rand(n) (o rand(m,n)) MATLAB crear una
matriz nxn ( mxn) con elementos generados aleatoriamente y distribuidos
uniformemente entre 0 y 1, por ejemplo
rand(2,3)
ans =
0.2190
0.0470
0.6789
0.6793
0.9347
0.3835
Si en lugar de que sus elementos estn distribuidos uniformemente queremos que sigan
una distribucin normal de media 0 y varianza 1 entonces teclearemos
randn(2,3)
ans =
1.1650
0.6268
0.0751
0.3516
-0.6965
1.6961
Comentar por ltimo respecto a la funcin rand que MATLAB ms que generar
nmeros aleatorios lo que hace es recorrer una lista muy larga de nmeros de modo que
cuando se le piden 6 nmeros aleatorios lo que hace es dar 6 nmeros consecutivos de
su lista. En ocasiones nos puede interesar que se nos ofrezca repetidas veces una misma
secuencia de nmeros aleatorios; para ello le indicaremos que se site en una posicin
concreta de la lista (por ejemplo, la 3)
rand('seed',3)
Si cada vez que pidamos una secuencia de nmeros aleatorios ejecutamos antes esta
instruccin, nos dar siempre la misma secuencia.
2.3 Por bloques.
Las matrices se pueden construir por bloques, usando para ello matrices previamente
definidas o cualquiera de las funciones que ya hemos visto. Por ejemplo, el siguiente
cdigo:
A=[1 3 5; 17 257 65537];
B=[A ones(2,2);eye(2,2) zeros(2,3)]
1
17
1
0
3
257
0
1
5
65537
0
0
1
1
0
0
1
1
0
0
Es recomendable tener presente que para escribir un real entre 0 y 1, puede obviarse el 0
a la izquierda de la coma, como seguramente el lector habr supuesto. De esta manera
0.003 puede igualmente escribirse .003.
Si el tope no se llega a alcanzar con el incremento establecido, el vector se corta por
defecto. Esto es,
0.2:0.2:1.1
representa a
[0.2 0.4 0.6 0.8 1.0]
Si escribimos
7:-2:3
obtendremos
[7 5 3].
12
Veamos cmo podemos usar los dos puntos para leer un vector al revs. Esto es, si
tenemos un vector
vector=[1 3 5 7 11 13 17]
11
Esta notacin de dos puntos es particularmente til, entre otras cosas, para introducir
matrices de grandes dimensiones. Si, por ejemplo, se necesita un vector A formado por
los cien primeros enteros (del 1 al 100), bastar escribir:
A=1:100;
Las siguientes instrucciones, por ejemplo, generan una tabla de senos, (sin es la
funcin seno, ver seccin 5).
x=[0.0:0.1:2.0];
y=sin(x);
[x;y]
Hagamos notar que al operar sin a coordenadas (ya veremos qu significa esto en la
seccin 3) produce un vector y a partir de x. [x;y] ser una matriz 2x21; en la primera
fila irn los valores de x y en la segunda los correspondientes del seno.
La notacin de dos puntos tambin nos ser til a la hora de extraer submatrices de una
matriz dada. Vemoslo con algunos ejemplos. Sea datos una matriz cualquiera.
datos(2:3, 4);
son sus cuatro primeras filas (la matriz formada por ellas).
Del mismo modo pueden usarse como ndices vectores enteros arbitrarios.
datos( :, [2, 4]);
13
Veamos otra posibilidad. Si, por ejemplo, A es una matriz 3x4, y B es otra matriz 6x3,
la siguiente instruccin:
A(:,[2 4]) = B([1 3 5],1:2);
cambia las columnas 2 y 4 de la matriz A por las 2 primeras columnas de las filas 1 y 5
de B. Obsrvese que las dimensiones de los bloques intercambiados deben coincidir
siempre. Si, por ejemplo, A es 3x5 y B es 4x4 habra que especificar qu elementos de
B son sustituidos en A; entre las muchas posibilidades, una sera:
En la seccin siguiente estudiaremos las operaciones con matrices y comprobaremos
cmo la notacin de dos puntos tambin es capaz de simplificarlas en gran medida.
2.5 Acceso a los elementos de la matriz.
Si queremos acceder al elemento de la fila i, columna j de la matriz almacenada en la
variable A, podemos hacerlo escribiendo A(i,j). Veamos esto con el siguiente ejemplo:
Matriz_mag=magic(3)
Matriz_mag =
8
3
4
1
5
9
6
7
2
Matriz_mag(3,1)
ans=4
3 Operaciones con
coordenada.
matrices.
Operaciones
coordenada
\
/
adicin
sustraccin
multiplicacin
potenciacin
traspuesta
divisin izquierda
divisin derecha
14
Si una de las matrices que opera es un escalar (el programa lo maneja como una matriz
1x1) entonces la operacin se har elemento a elemento. En el resto de los casos se
deber observar que las dimensiones de las matrices operadas sean compatibles.
Con la divisin a izquierda y a derecha podemos resolver ecuaciones matriciales. As:
x = A\b es la solucin de A*x = b
x = b/A es la solucin de x*A = b.
Para ms detalles sobre la divisin a derecha e izquierda ver las ayudas de las funciones
mrdivide (matrix right divide) y mldivide (matrix left divide). Para ms ayuda sobre
las operaciones matriciales en general ver help ops.
Un ejemplo sencillo de cmo la notacin de dos puntos puede usarse conjuntamente con
las operaciones matriciales para simplificar notablemente el cdigo con respecto a otros
lenguajes de programacin es el siguiente. Supongamos A una matriz 2x4 cualquiera ;
las columnas 2 y 4 de A pueden multiplicarse por la derecha por una matriz 2x2,
digamos la [1 2; 3 4] como sigue:
A(:,[2,4]) = A(:,[2,4])*[1,2;3,4]
Igualmente puedo usar los operadores ^, \ y / para operar punto a punto. As:
[1 8 27].^(1/3)
da como resultado
ans = [1 2 3]
15
sin
sinh
log2
sign
round
fix
cos
asin
log10
sqrt
floor
rem
tan
exp
log (ln)
abs
ceil
Por ejemplo:
x=pi/4;
sin(x)
ans = 0.7071
O tambin:
x=[0:4; 5:9];
sin(x)
ans = 0
-0.9589
0.8415
-0.2794
0.9093
0.6570
0.1411
0.9894
-0.7568
0.4121
sum
median
any
min
prod
mean
all
sort
cumsum
std
Veamos como ejemplo la funcin sort, que ordena los elementos de un vector
a=[1 7 2 5 4];
sort(a)
ans = 1 2 4 5 7
Tambin pueden operar sobre matrices, pero entonces lo hacen columna a columna (o
fila a fila, si operamos sobre la matriz traspuesta), produciendo un vector fila que
contiene el resultado de su aplicacin a cada columna. Vemoslo con un ejemplo:
datos=round(rand(3,4)*10)
datos =
1
6
0
2
3
7
2
2
4
vec_max=max(datos)
vec_max = 2
6
9
5
4
16
chol
hess
poly
rank
svd
schur
det
inv
rref
size
lu
expm
norm
Hasta ahora al manejar funciones estas nos han proporcionado un nico resultado (ya
sea escalar, vector o matriz), pero las funciones de MATLAB pueden tener ms de un
argumento de salida (ver seccin 8.3). As, si escribimos
a=[34 52 78 21 9 56 13 1];
minimo=min(a(1:5))
minimo = 9
Las instrucciones se ejecutarn SLO si la relacin es cierta, y lo harn una sola vez.
Es posible encadenar varios ifs (ifs anidados); para ello se usa, al igual que en C, la
instruccin else. Si se desea anidar otra sentencia if dentro del else, se escribir
elseif . Por ejemplo, el siguiente grupo de instrucciones nos permite obtener la
funcin signo de x (sign(x)), que a cada real x le hace corresponder 1 si x es
estrictamente mayor que 0, -1 si x es estrictamente menor que 0 y 0 si x es nulo:
if x >=0
if x > 0
signo = 1;
else
signo = 0;
end
else
17
o de otro modo:
if x >
signo
elseif
signo
else
signo
end
0
= 1;
x < 0
= -1;
= 0;
(las comas son opcionales, aunque preferibles para una mayor claridad).
5.2
Operadores relacionales.
menor que
mayor que
menor o igual que
mayor o igual que
igual a
distinto (el smbolo ~ se obtiene con ALT+126)
|(ALTGR+1)
(ALT+126)
no
Si en una relacin los dos trminos comparados son escalares, el resultado ser 1 0
dependiendo de si la relacin es cierta o falsa, respectivamente. Puede, por tanto,
asignarse a una variable el valor resultante de una relacin. Por ejemplo, si escribimos:
A = 2^2 == 4
se le asignar a A el valor A = 1
18
"O exclusivo".
Devuelve uno (verdadero) cuando slo x o slo y son
verdaderos, esto es, x verdadero e y falso, o viceversa.
Devuelve cero (falso) cuando tanto x e y son ambos falsos
o ambos verdaderos.
any (x)
all (x)
Es importante mencionar que tanto all como any son funciones vectoriales y que por
tanto actan como tales (ver seccin 4.2). Conviene tener esto en cuenta cuando estas
funciones sean aplicadas a matrices y no a vectores.
NOTA: Se debe tener cuidado al comparar matrices en los if y en los while. Si, por
ejemplo, en un if queremos preguntar si las matrices son iguales podemos escribir:
if A == B
...
end
pero si se desea comprobar si las dos matrices son distintas deberemos usar una de las
dos posibilidades siguientes:
1) if
A == B
...
else
end
2) if
any(any(A=B))
...
end
19
A = B,
...
end
Bucles.
Observar que es empleada la notacin de dos puntos ya estudiada (seccin 2.4) para
hacer que el ndice vaya recorriendo los valores deseados y que no son precisos los
parntesis. Veamos, por ejemplo, como usar esto para generar los 8 primeros nmeros
de fibonacci e irlos almacenando en un vector fibon.
fibon=[1 1];
for i=3:8
fibon=[fibon fibon(i-1)+fibon(i-2)]
end
Enumeramos a continuacin ciertas propiedades de los bucles "for", que conviene tener
siempre muy presentes:
a) Es posible anidar varios bucles "for". Por ejemplo, las instrucciones:
encontrado=0;
for i=1:size(matriz,1)
for j=1:size(matriz,2)
if matriz(i,j)==3
encontrado=1;
break
end
end
if encontrado==1, break, end
end
encontrado
20
produce el vector x=[1 2 3 4 5]. Para terminar un bucle debe usarse la instruccin
break o bien return si estamos trabajando con archivos de funciones (ver seccin
8.2). Si estamos trabajando con bucles anidados break slo acabar el bucle ms
interno, de ah que en a) hayamos usado 2 break.
c) Cualquier vector de MATLAB es aceptable en un bucle "for":
data=[3 9 45 6; 7 16 -1 5];
for n=data
x=n(1)-n(2)
end
e) IMPORTANTE: Los bucles "for" han de ser evitados siempre que sea posible
encontrar una expresin equivalente que resuelva satisfactoriamente el problema,
pues requieren ms clculos y, por tanto, ms tiempo de cmputo que la mayora del
resto de las expresiones. Por ejemplo, el siguiente cdigo (qu produce?):
for n=1:10
x(n)=sin(n*pi/10);
n=10;
end
21
El contenido del bucle while se ejecutar mientras la condicin sea cierta. Observar que
la relacin no ha de ir entre parntesis. Por ejemplo, dado un real a, las instrucciones
siguientes calculan y muestran el menor entero no negativo n, tal que 2^n >= a:
n = 0;
while 2^n < a
n = n+1;
end
n
O tambin:
exp(10000)
ans = Inf
22
(observar que a la hora de escribir en MATLAB, puede escribirse tanto NaN como nan)
b=2*a
b =
NaN
18
NaN
c=sqrt(a)
c = 1.0000
1.4142
NaN
d=(a==nan)
d = 0
f=(a~=nan)
f = 1
3.0000
NaN
Los anteriores dos primeros cdigos reciben NaNs y producen NaNs. Sin embargo, de
los dos ltimos cdigos relacionales obtenemos resultados un tanto sorprendentes:
(a==nan)
produce siempre ceros (Falso) incluso cuando NaN es comparado con NaN. De idntica
forma,
(a~=nan)
produce todos unos (Verdadero). Observamos con esto que los NaNs individuales no
son iguales entre s. Como un resultado importante de esta propiedad, MATLAB posee
una funcin lgica para encontrar NaNs: isnan.
g=isnan(a)
g = 0
Esta funcin hace posible hallar los ndices de los NaNs en un vector o matriz, usando
para ello el comando find, cuya utilidad resulta bastante intuitiva, (el smbolo % en el
trozo de cdigo escrito a continuacin indica un comentario; ver seccin 8):
i=find(isnan(a))
i = 3
5
a(i)=zeros(i)
a = 1
2
23
7 Matrices vacas
Mientras que los NaNs estn matemticamente bien definidos por los estndares de la
IEEE, las matrices vacas estn definidas por los creadores de MATLAB y tienen sus
particulares e interesantes propiedades. Las matrices vacas son simplemente eso. Son
variables de MATLAB de dimensin nula.
size( [ ] )
ans = 0
0
En MATLAB muchas funciones retornan matrices vacas cuando ningn otro resultado
es apropiado. Quizs el ejemplo ms comn sea el del comando find:
x=(1:5)-3
x = -2
-1
y=find(x>2)
y = [ ]
En este ejemplo, x no contiene ningn valor mayor que 2, por lo que no hay ndices que
devolver. Para probar con resultados vacos, MATLAB provee la funcin isempty:
isempty(y)
ans = 1
lo que muestra que una matriz vaca no es igual a un escalar (ni siendo ste nulo); as:
find(y==0)
ans = [ ]
nos dice que no existen ndices que retornar. Del mismo modo:
b=(y~=0)
b = 1
Bien, como hemos dicho, una matriz vaca no es lo mismo que un escalar, sin embargo:
j=find(y~=0)
j = 1
nos proporciona un ndice aun cuando y posee dimensin cero. Este ltimo ejemplo es
un cambio no documentado en MATLAB desde la versin 3.5. En versiones
anteriores a la 4.0, al comparar una matriz no vaca con una s vaca se obtena como
respuesta una matriz vaca. Esta nueva interpretacin generalmente conduce a
problemas, ya que
24
y(find(y~=0))
NO EXISTE.
Por ejemplo:
y(find(y~=0))
??? Index exceeds matrix dimensions.
Aqu MATLAB retorna un error porque el ndice se encuentra fuera de las dimensiones
de la matriz vaca y.
8 Archivos *.m.
En esta seccin aprenderemos cmo podemos aadir nuestras funciones a las que
MATLAB posee y adaptarlo as a nuestras necesidades. Veremos como almacenar las
instrucciones o rutinas que deseemos en archivos, que tendrn la extensin .m para
poder hacer uso de ellas cuando las necesitemos. Distinguiremos dos tipos de archivos:
8.1 Creacin y edicin de un archivo .m.
Para crear un nuevo archivo .m abriremos el men file de la barra de herramientas y
seleccionaremos new M-file. Una vez hecho esto se abrir el editor de MATLAB en
el que podremos empezar a escribir las instrucciones que deseemos.
Para editar un archivo .m abriremos el men file de la barra de herramientas,
seleccionaremos open e indicaremos donde se encuentra el archivo que queremos
editar.
Tambin podemos usar para la creacin y edicin de archivos .m cualquier editor de
texto, siempre que este sea ASCII.
8.2 Archivos de instrucciones.
En ellos escribiremos una cadena de instrucciones que queremos que se ejecute cada
vez que tecleemos el nombre del archivo. Podemos, por ejemplo, crear un archivo que
se llame rutina.m de manera que cuando escribamos en la lnea de comando
rutina
25
contenga un valor aproximado del nmero e. Podemos crear un archivo que se llame
mi_entorno.m y escribir en l:
clear
format short e
e=2.718281
De esta manera, cada vez que queramos ejecutar estas 3 instrucciones teclearemos
mi_entorno
Tratemos de aclarar este cdigo. La primera lnea declara el nombre de la funcin, los
argumentos de entrada y los de salida. Hagamos constar que una funcin puede tener
argumentos o bien simples, o bien mltiples, tanto de entrada como de salida. En este
caso hay un solo argumento de salida y un argumento de entrada o parmetro.
Veamos como usar la funcin . Supongamos que queremos calcular el factorial de 10,
slo tendremos que escribir:
f10=factorial(10)
f10 = 3628800
26
diferencia del lenguaje C, por ejemplo, MATLAB no espera un segundo % que indique
el fin del comentario: toda la lnea lo es. Eso s, la siguiente lnea, si no se especifica
nada, no forma parte del comentario. Por supuesto, se pueden usar tantas lneas de
comentario como se deseen, pero eso s, todas precedidas del smbolo %. Si escribimos
help factorial
nargout
Si queremos tirar 2 dados de 10 caras y que nos de la suma de las tiradas usaremos
entonces la siguiente instruccin:
[vec_tiradas,suma]=simula(2,10)
27
NOTA: Como hemos podido observar aunque la funcin tiene dos argumentos de salida
nosotros podemos pedir que slo nos devuelva el primero. As, por lo general, si en una
funcin con varios argumentos de salida nosotros pedimos que nos devuelva uno, nos
devolver el primer parmetro de salida (tiradas en este caso). Ms an, si en la lnea
de llamada especificamos que nos devuelva n resultados, la funcin slo devolver los n
primeros.
Si escribimos
vec_tiradas=simula(4)
vec_tiradas = 3 2 2 5
28
ms importantes. Para cualquier duda, como siempre, acuda a la ayuda y practique con
ellas.
DIR: Listado de directorios. La instruccin
dir nombre_de_directorio
por s solo, lista los anteriores archivos del actual directorio de trabajo. El comando
what nombre_de_directorio
what matlab/general
29
muestra el path completo de la funcin especificada, la cual puede ser tanto un archivo
*.m, como una funcin interna, o algn otro tipo. Las funciones internas, o built-in
son aquellas que MATLAB ya posee de por s mismo, y al operar con ellas el comando
which muestran un mensaje indicando que lo son. Por ejemplo,
which inv
busca la cadena ABC en las primeras lneas de comentario (la lnea H1) de todas las
entradas de ayuda de archivos *.m del MATLABPATH. Para cada archivo cuya lnea
H1 contenga la cadena ABC el comando lookfor muestra dicha lnea H1. Por ejemplo,
lookfor inverse
halla al menos una docena de archivos que contienen la cadena inverse en su lnea H1
de la ayuda, incluyendo aquellas que contienen inverse hyperbolic cosine, twodimensional inverse FFT y pseudoinverse. Contraste esto con
which inverse
what inverse
30
busca la cadena ABC en el primer bloque completo de comentario de cada archivo *.m.
As pues, en definitiva, WHAT lista las funciones de un directorio dado, WHICH
encuentra el directorio que contiene una funcin dada y LOOKFOR encuentra todas las
funciones de todos los directorios que puedan tener algo que ver con una palabra clave
dada.
EXIST: Comprueba la existencia o no existencia de variables y funciones.
exist(A)
31
Size
Bytes
1x20
1x2
Class
40
16
char array
double array
Para ver la representacin ASCII que se esconde bajo una cadena de texto, solo se
necesitan realizar algunas operaciones aritmticas en la cadena. La ms sencilla y eficaz
es tomar el valor absoluto de la cadena:
u=abs(s);
As, si u es un vector fila en el cual se encuentran los valores absolutos de los valores
ASCII de cada carcter. Qu generara la siguiente asignacin?:
t=u+1;
La funcin
setstr
32
v=setstr(u)
v = Hola, soy una cadena
Puesto que las cadenas son, como hemos dicho, vectores numricos, estas pueden ser
manipuladas con cualquier herramienta de manipulacin de vectores disponible en
MATLAB. Por ejemplo, y manteniendo la notacin empleada:
w = s(15:20)
w = cadena
Al igual que con las matrices, las cadenas de texto pueden tener mltiples filas, pero
cada una de ellas ha de tener el mismo nmero de columnas. As pues, los espacios en
blanco son estrictamente necesarios para que todas las filas posean la misma longitud
(=el mismo nmero de columnas). Por ejemplo:
d=[Las cadenas de texto que tengan ms de una
fila han de tener
Vemoslo:
33
disp(a)
El cielo est enladrillado,
i=find( a>=a & a<=z );
%N0 CONFUNDIR a carcter con a cadena.
a(i)=setstr(u(i)-(a-A))
a =
EL CIELO EST ENLADRILLADO,
Como dato casi anecdtico, comentar que para escribir comillas simples en una cadena
de texto se escriben dos comillas simples seguidas.
Es preferible, para mostrar los mensajes de error, usar la funcin
error
Por ejemplo,
error ('Hola, pues yo soy un mensaje de error');
Y decimos que es preferible, ya que mediante ella la ejecucin sale del archivo *.m.
Esta funcin tambin es nombrada en la seccin siguiente.
En un archivo .m, el usuario puede ser avisado para introducir datos interactivamente,
usando para ello la funcin
input
')
34
ejecuta una funcin especificada por una cadena de caracteres. As, si F es una cadena
de caracteres conteniendo el nombre de una funcin (usualmente definida en un archivo
.m), entonces
feval(F,x1,...,xn)
evaluar esa funcin con los argumentos dados. Por ejemplo, si F=simula es el
nombre de la funcin que vimos en la seccin 8.3 entonces las dos expresiones
siguientes son equivalentes:
simula(3,12)
feval(F,3,12)
Un ejemplo del uso de feval es la funcin de MATLAB fzero, que encuentra los ceros
de una funcin que se le pasa como parmetro en un intervalo dado que tambin recibe
como parmetro.
Uno de los parmetros que le pasemos a la funcin puede ser un vector. De este modo,
si pretendemos calular el valor del seno en varios puntos, podramos escribir:
feval(sin, [0, pi/2, pi, 3*pi/2])
ans = [0, 1, 0, -1]
Otra funcin de MATLAB que evala cadenas es eval, la cual ejecuta una cadena que
contiene una expresin de MATLAB. Es decir, si s es una cadena,
eval(s)
hace que MATLAB ejecute una cadena como una instruccin o comando. Podemos
escribir por tanto (mientras que con feval no):
eval(sin(0))
ans = 0
Esta funcin admite tambin dos argumentos de entrada. Consltese la ayuda para una
mayor profundizacin.
Una funcin que suele ser empleada con eval cuando esta es de doble entrada es lasterr.
lasterr
sencillamente devuelve una cadena con el ltimo mensaje de error dado por MATLAB.
35
Por su parte,
lasterr()
resetea a lasterr, de modo sta devuelve una matriz vaca hasta que MATLAB vuelva
a generar un mensaje de error.
lasterr();
lasterr
ans = []
12 El operador !.
Desde MATLAB podemos utilizar instrucciones del MS-DOS como copy, del...,
evitando as tener que salir del programa para realizar estas tareas. Esto se hace usando
el operador !. Pruebe el lector a teclear las siguientes instrucciones en MATLAB:
copy nombre_archivo c:\temp
!copy nombre_archivo c:\temp
36
Esto quiere decir que MATLAB ha realizado 43 operaciones desde el inicio de la sesin
Si ahora tecleamos
flops(0)
flops
ans=0
37
Para medir el tiempo que tarda en ejecutarse un algoritmo nos apoyaremos en las
funciones de MATLAB clock y etime. La funcin clock devuelve un vector de 6
elementos que contiene la hora (hasta centsimas de segundo) y fecha actual en formato
decimal. Si slo deseamos visualizar la hora y fecha actual lo haremos as:
fix(clock)
ans= 1998 3 21 10 37 46
y obtenemos por respuesta que la fecha actual es 21-03-1998 y que la hora actual es
10:37:46. Sin embargo para la medicin del tiempo transcurrido usaremos slo clock.
Por otra parte, dados dos tiempos t1 y t2, la funcin etime(t1,t2) (del ingls elapsed time tiempo transcurrido) nos proporciona el tiempo transcurrido de t1 a t2. As, si deseamos
saber cunto tiempo invierte MATLAB en resolver la ecuacin Ax=b usando
eliminacin Gaussiana slo tenemos que introducir la siguiente secuencia de
instrucciones (primero definiremos A y b como matrices 200x200 y 200x1 de contenido
arbitrario):
A=rand(200); b=rand(200,1);
t1=clock; x=A\b; t2=clock; tiempo=etime(t2,t1)
tiempo=0.5500
No obstante, para el ejemplo concreto que hemos propuesto nos ser ms sencillo
utilizar las funciones tic y toc. Tic pone en marcha un cronmetro y toc lo detiene y nos
devuelve el tiempo transcurrido. As, la secuencia anterior la podemos escribir como:
tic;x=A\b;toc
Si prueba el lector a repetir estas instrucciones varias veces observar que el tiempo
trasncurrido no es el mismo. Esto ocurre sobre todo en los sistemas operativos
multitarea como el Windows en el que se pueden ejecutar aplicaciones
simultneamente. De ah que al medir el tiempo deba evitarse en la medida de lo posible
estar usando otras aplicaciones que no sean el MATLAB, para obtener as una
estimacin ms fiable del tiempo transcurrido.
38
Veamos algunas posibilidades (con help format pueden verse todos los formatos
posibles):
format short
(el formato por defecto, con 4 decimales)
B=rand(1,3)
B = 0.8180
0.6602
0.3420
0.2897
format long e
(formato cientfico con 15 decimales)
B
B = 8.384960449380805e-001
5.680724610077758e-001
3.704135566321165e-001
format rat
(aproxima el nmero a una fraccin)
B=pi
B = 355/113
Cada vez que se inicia MATLAB el formato se fija en 4 decimales (el format short) y
cuando se cambia, el nuevo formato se mantiene mientras no se ordene otro cambio.
Si se quiere trabajar con, por ejemplo, dos decimales habr que recurrir a trucos de la
forma:
B=round(rand(1,4)*100)/100
B = 0.9500
0.2300
0.6100
0.4900
16 Hardcopy.
Cuando trabajemos con MATLAB podemos ir almacenando todo lo que aparece con la
instruccin
diary nombre_de_archivo
Con ella, todo lo que aparezca posteriormente en pantalla (salvo grficos) se escribir en
el archivo nombre_de_archivo (si se omite el nombre el archivo se toma por defecto
diary) hasta que se ordene
diary off
Este archivo se puede editar e imprimir, incluso sin salir de MATLAB (recuerde el
operador !).
17 Grficos.
MATLAB dispone de varios directorios de funciones especficamente dedicados al
tratamiento de grficos. Gracias a ellos podremos crear grficos bidimensionales,
39
tridimensionales y modificarlos. Aunque aqu tan solo veremos una parte, para
profundizar en el manejo de grficos recomendamos al lector que consulte la ayuda de
los directorios graphics, graph2d, graph3d y specgraph.
17.1 Grficos bidimensionales
Dados dos vectores x e y de la misma longitud, con la orden
plot(x,y)
-0.5
0.5
El vector x representa la particin uniforme del intervalo [-1,1] con paso 0.0001 y el
vector y representa los valores de la funcin x^5 (obsrvese que hemos necesitado la
operacin coordanada a coordenada .^ para elevar al vector x a la 5 potencia) en los
puntos de la particin. MATLAB representar en el grfico los puntos del vector y y los
unir mediante rectas. Pruebe el lector a teclear
x=-1:0.5:1; y=x.^5; plot(x,y)
figure(gcf)
40
0.8
0.8
0.6
0.6
0.4
0.4
0.2
0.2
-0.2
-0.2
-0.4
-0.4
-0.6
-0.6
-0.8
-0.8
-1
-1
-0.5
0.5
-1
-1
-0.5
0.5
-0.5
0.5
41
axis(c)
se establecer el escalado con los lmites que hemos indicado mediante el vector c.
Pruebe el lector a darle un valor concreto al vector c (xmax, ymin, etc...). Si escribimos
ahora
axis
volveremos al autoescalado.
Para mejorar la presentacin de nuestra grfica podemos usar los siguientes comandos
(ver sus ayudas para ms informacin y help graphics para conocer ms funciones):
legend(texto_leyenda)
title('nombre_ttulo')
xlabel('texto')
ylabel('texto')
gtext('texto')
text(x,y,'texto')
Los dibujos mltiples (varias funciones representadas en una nica grfica) se pueden
obtener de tres formas. La primera se ilustra con el siguiente ejemplo:
x=0:.1:2*pi;y1=sin(x);y2=sin(2*x); plot(x,y1,'b-.',x,y2,'k')
42
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
Una segunda forma es formando una matriz Y conteniendo los valores funcionales
como columnas. As, con la siguiente secuencia de instrucciones veremos las grficas de
las funciones y=cos(x), y=1/2:
x=0:.01:2*pi;Y=[cos(x)',(ones(1,size(x,2))/2)'];plot(x,Y)
hold on
Esta instruccin hace que un nuevo grfico se aada al que haba en la pantalla grfica
en lugar de reemplazarlo. Si escribimos nuevamente hold o hold off entonces cada
nuevo grfico reemplazar al anterior (este es el modo por defecto). Pruebe el lector a
escribir las siguientes instrucciones:
x=-pi:.05:pi;y=sin(x);plot(x,y)
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
-4
-3
-2
-1
hold
x=-pi:.05:pi;y=cos(x);plot(x,y,'ro')
text(-2.5,0.6,'y=cos(x)')
text(2.7,0.6,'y=sin(x)')
43
1
0.8
0.6
y=cos(x)
y=sin(x)
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
-4
-3
-2
-1
1
0.5
0.5
-0.5
-0.5
-1
-5
-1
-5
0.5
-0.5
-0.5
-1
-5
-1
-5
44
Con la instruccin
subplot(m,n,h)
Basta con este comando para que la impresora produzca una copia en alta resolucin de
la pantalla grfica actual. Consltese la ayuda help print para conocer los parmetros
que pueden usarse.
17.3 Grficos en el portapapeles.
Con MATLAB podemos copiar el contenido de la ventana grfica en el portapapeles y
despus pegar dicho contenido en cualquier programa que lo permita (as hemos hecho
los grficos de este manual). Para copiar su contenido en el portapapeles
seleccionaremos copy figure del men Edit de la ventana grfica y en adelante
podremos trabajar con el contenido de la ventana como lo haramos con cualquier
objeto del portapapeles, pegndolo donde sea necesario.
17.4 Grficos tridimensionales.
Veremos 3 funciones que nos permiten en MATLAB dibujar grficos en 3 dimensiones:
mesh, plot3 y surf.
Los grficos de malla de superficies tridimensionales se hacen con la funcin
mesh(z)
45
donde z es una matriz. La superficie de malla est definida por las coordenadas z de los
puntos sobre un cuadriculado rectangular en el plano XY. Intntelo con
t=[0:.01:pi;pi:.01:2*pi];mesh(sin(t))
Junto con mesh se puede hacer usar la funcin meshgrid. Con ella se define la
cuadrcula sobre la que dibujaremos la grfica de la funcin.Veamos, por ejemplo, la
grfica de la funcin silla de montar en el intervalo [-pi,pi]x[-pi,pi]
46
20
15
10
5
0
1
0.5
1
0.5
-0.5
-0.5
-1
-1
47
GENERAL
help
demo
who
what
which
clear
length
size
^C
exit o quit
ayuda
demostraciones
muestra variables en memoria
muestra archivos .m en el disco
muestra el path de un archivo .m
limpia el espacio de trabajo
longitud de un vector
nmero de filas y columnas
interrupcin local
salida de MATLAB
cd
delete
diary
dir
load
save
type
fprintf
ARCHIVOS DE DISCO
cambiar de directorio
borrar archivo
diario de la sesin
directorio de archivos en el disco
cargar variables de un archivo
guardar variables en un archivo
mostrar funcin o archivo
escribir en un archivo
ans
eps
pi
i, j
inf
NaN
clock
date
flops
nargin
nargout
VALORES ESPECIALES
respuesta cuando no se asigna la expresin
precisin
sqrt(-1)
no nmero
reloj
fecha
nmero de operaciones
nmero de argumentos de entrada de una funcin
nmero de argumentos de salida de una funcin
48
+
*
/
\
^
OPERADORES MATRICIALES
suma
resta
multiplicacin
divisin derecha
divisin izquierda
potenciacin
traspuesta
max
min
sort
sum
prod
cumsum
median
mean
std
inv
rank
det
trace
poly
cond
norm
expm
logm
sqrtm
+
.*
./
.\
.^
OPERADORES PUNTUALES
suma
resta
multiplicacin
divisin derecha
divisin izquierda
potenciacin
FUNCIONES ESCALARES
funciones trigonomtricas
funciones hiperblicas
inversas de las funciones trigonomtricas
logaritmos en base 2, base 10 y neperiano
exponencial
signo
raz cuadrada
valor absoluto
diferentes redondeos
FUNCIONES VECTORIALES
elemento de valor mximo
elemento de valor mnimo
ordena en orden creciente
suma de elementos
producto de elementos
suma acumulativa de elementos
Mediana
Media
desviacin tpica
FUNCIONES MATRICIALES
Inversa
Rango
Determinante
traza (suma de los elementos diagonales)
polinomio caracterstico
nmero de condicin en la norma 2
norma 1, norma 2, norma
matriz exponencial
matriz logaritmo
matriz raz cuadrada
49
compan
diag
eye
gallery
hadamard
hankel
hilb
invhilb
linspace
logspace
magic
meshdom
ones
pascal
rand
randn
toeplitz
vander
zeros
MATRICES ESPECIALES
compaera
diagonal
identidad
esotrica
Hadamard
Hankel
Hilbert
inversa de Hilbert
vectores igualmente espaciados
vectores logartmicamente espaciados
mgica cuadrada
dominio para puntos de malla
matriz de unos
Pascal
elementos aleatorios
elementos aleatorios distribuidos uniformemente
Toeplitz
Vandermonde
matriz de ceros
DESCOMPOSICIONES Y FACTORIZACIONES
forma equilibrada
balance
sustitucin regresiva
backsub
convierte diagonales complejas en diagonales reales
cdf2rdf
factorizacin de Cholesky
chol
autovalores y autovectores
eig
forma de Hessenberg
hess
factorizacin LU
lu
mnimos cuadrados con restricciones
nnls
base ortonormal del ncleo
null
base ortonormal de la imagen
orth
pseudoinversa
pinv
factorizacin QR
qr
factorizacin QZ para autovalores generalizados
qz
forma escalonada reducida por filas
rref
descomposicin de Schur
schur
descomposicin en valores singulares
svd
50
rot90
fliplr
flipud
diag
tril
triu
reshape
MANIPULACIN DE MATRICES
rotacin
invierte el orden de las columnas
invierte el orden de las filas
diagonal
parte triangular inferior
parte triangular superior
reordena una matriz en otra
traspuesta
convierte una matriz en una columna simple; A(:)
if
elseif
else
end
for
while
break
return
pause
CONTROL DE FLUJO
ejecuta instrucciones condicionalmente
usado con if
usado con if
termina if, for, while
repite instrucciones un nmero de veces
repite instrucciones mientras una sentencia lgica sea verdadera
sale de los bucles for y while
salida desde funciones
pausa hasta que se pulse una tecla
51
input
keyboard
error
function
eval
feval
echo
exist
casesen
global
startup
getenv
menu
etime
PROGRAMACIN Y ARCHIVOS .M
obtiene nmeros desde el teclado
llamada al teclado como si fuera un archivo .m
muestra mensaje de error
define funcin
evala un texto en variables
evala funcin dada por una cadena
permite mostrar las instrucciones en pantalla
comprueba si las variables existen
sensibilidad a las maysculas
define variables globales
archivo de inicializacin
accede a una variable de entorno
genera un men
tiempo gastado
abs
eval
num2str
int2str
setstr
sprintf
isstr
strcomp
hex2num
TEXTO Y CADENAS
convierte cadena en valores ASCII
evala texto como instrucciones
convierte nmeros en cadenas
convierte enteros en cadenas
indicador de cadenas
convierte nmeros en cadenas
detecta variables de cadena
compara variables de cadena
convierte cadenas hexadecimales en nmeros
plot
print
loglog
semilogx
semilogy
polar
mesh
contour
meshgrid
bar
errorbar
stairs
GRFICOS
grfico lineal en el plano XY
enva grfico a impresora
grfico logartmico en el plano XY
grfico semilogartmico
grfico semilogartmico
grfico polar
superficie de malla tridimensional
plano de contornos
dominio para grficos de superficie
grficos de barras
aade barras de errores
grficos de escaleras
52
bessel
gamma
rat
erf
inverf
ellipk
ellipj
poly
roots
roots1
polyval
polyvalm
conv
deconv
residue
polyfit
abs
angle
conv
corrcoef
cov
deconv
fft
fft2
ifft
Ifft2
fftshift
quad
quad8
ode23
ode45
FUNCIONES ESPECIALES
funcin de Bessel
funcin Gamma
aproximacin racional
funcin de error
inversa de la funcin de error
integral de la funcin de error
integral elptica de Jacobi
POLINOMIOS
polinomio caracterstico
races de polinomios-mtodo de la matriz
compaera
races de polinomios-mtodo de Laguerre
evaluacin de polinomios
evaluacin polinomio matricial
multiplicacin
divisin
desarrollo en fracciones parciales
ajuste por un polinomio
PROCESO DE SEALES
mdulo complejo
argumento complejo
convolucin
coeficientes de correlacin
covarianza
deconvolucin
transformada rpida de Fourier
FFT 2-dimensional
FFT inversa
FFT inversa 2-dimensional
cambia las dos mitades de un vector
INTEGRACIN NUMRICA
funcin de integracin numrica
funcin de integracin numrica
53
fmin
fmins
fsolve
fzero
spline
table1
table2
INTERPOLACIN
spline cbico
genera tablas 1-D
genera tablas 2-D
54