Introducción a Matlab 6.1 (2ª Parte) Cadenas de caracteres (strings)

Anuncio
ETSII-UPM
Introducción a Matlab 6.1
(2ª Parte)
Matemáticas de la Especialidad (Mecánica-Máquinas)
Madrid, 1 de octubre de 2002
Javier García de Jalón
ETSII - Departamento de Matemática Aplicada
a la Ingeniería Industrial
Cadenas de caracteres (strings)
ETSII-UPM
q
Las cadenas de caracteres
Ø
Ø
q
Conversión entre caracteres y números
Ø
Ø
q
La función double(str) convierte una cadena en un vector de números ASCII
La función char(vect) convierte un vector de números en cadena de caracteres
Matrices de caracteres
Ø
Ø
Ø
q
Se definen entre apóstrofos: 'cadena', 'mi casa', 'ni ''idea'''
Los caracteres se guardan en un vector (2 bytes por carácter)
Cada fila es una cadena de caracteres
Todas las filas tienen el mismo número de elementos (se completan con
blancos las filas con menos caracteres)
Ejemplo: matchar=char('más', 'madera');
Funciones para cadenas de caracteres
Ø
Ø
Ø
Ø
Ø
Conversión: double(cad), char(vect), char(c1,c2,c3), int2str(n), num2str(d),
str2double(s), cellstr(str)
Comparación: strcmp(c1,c2), strcmpi(c1,c2), strncmp(c1,c2,n), c1==c2
Concatenación: frase=['str1', ' ', 'str2', ' ', 'str3'];
Búsqueda y sustitución: findstr(c1,c2), strmatch(frs, str), strrep(c1,c2,c3)
Descomposición de una frase en palabras: [p1,resto]=strtok(str)
1
Hiper-matrices
ETSII-UPM
q
Matrices con más de dos dimensiones
Ø
Ø
Ø
q
La última dimensión representa la “profundidad”
de la matriz
Se pueden utilizar para almacenar varias matrices
distintas pero con el mismo tamaño y significado
La función cat(d, A, B) sirva para concatenar dos
matrices iguales según la dimensión "d"
Ejemplo:
A(i,j,k)
i
k
j
HM[:,:,1]=rand(3);
HM[:,:,2]=eye(3);
q
Funciones de Matlab que permiten trabajar con hiper-matrices
Ø
Ø
Ø
Ø
Todas las funciones que actúan sobre escalares se aplican elemento a elemento
Las funciones que actúan sobre vectores (sum, max, ...) se aplican según la
primera dimensión, resultando una matriz de una dimensión menos
Las funciones matriciales de Álgebra Lineal (inv, det, ...) se aplican sólo a submatrices previamente extraídas de la hiper-matriz
Otras funciones: size, ndims, squeeze, permute, ipermute, ... (ver en Help)
Matrices dispersas (sparse)
ETSII-UPM
q
Matrices dispersas o sparse
Ø
Ø
q
Son matrices que tienen la mayor parte
de sus elementos cero
Sólo se almacenan y sólo se opera con
los elementos distintos de cero
Almacenamiento de matrices sparse
Ø
Ø
Ø
Ø
Ø
Ø
Se almacena un vector con los nnz
valores distintos de cero
Se almacena otro vector con los nnz
índices de fila de cada valor
Se almacenan en un tercer vector las n posiciones en los vectores anteriores de
los primeros elementos distintos de cero de cada columna
Ejemplo: con load west0479; se carga en memoria un ejemplo de una matriz
de 479×479 con sólo 1887 elementos distintos de cero (ver con spy(west0479))
Las funciones S=sparse(A); y A=full(S); permiten pasar de matrices llenas a
dispersas y viceversa
n=128; f=0.9; A=rand(n); A(find(A>f))=1; A(find(A<=f))=0; S=sparse(A);
2
Matrices dispersas (2)
ETSII-UPM
q
Funciones para crear matrices sparse
Ø
Ø
q
Otras funciones para operar con matrices sparse
Ø
Ø
Ø
Ø
q
full(S), find(S), [i,j,val]=find(S)
nnz(S), nonzeros(S), spy(S), issparse(S)
spfun('funName',S)
Reordenar los elementos: p=colmmd(S), p=symmmd(S), p=symrcm(S)
Funciones de Álgebra Lineal
Ø
Ø
q
speye(n), sprand(n,m), sprandn(n,m), sprandsym(n), spdiags(A)
sparse(A), sparse(m,n), sparse(i,j,val,m,n)
Se puede utilizar el operador \ igual que para matrices llenas
[L,U,P]=lu(S), [L,u]=luinc(S), L=chol(S), L=cholinc(S), [Q,R]=qr(S),
[V,D]=eigs(S), svds(S), normest(S,tol), condest(S), sprank(S)
Criterios prácticos para trabajar con matrices sparse
Ø
Ø
Las funciones y operadores de Matlab tienden a conservar el carácter de los
argumentos —lleno o sparse— de la forma más lógica y razonable
Consultar el Help para una información más detallada
Estructuras (struct)
ETSII-UPM
q
Estructuras:
Ø
Ø
q
Agrupación de datos de naturaleza diversa bajo un nombre común
Cada uno de esos datos tiene también su propio nombre y genéricamente se
llama campo (field)
Ejemplo: la estructura alumno tiene como campos numero y nombre
alumno.numero=97894; alumno.nombre='Luis Pérez';
alumno=struct('numero', 97894, 'nombre', 'Luis Pérez');
q
Otras características:
Ø
Ø
Ø
q
Pueden crearse vectores de estructuras:
alumno(50).numero=97894; alumno(50).nombre='Luis Pérez';
Una estructura puede contener otras estructuras (por ejemplo una fecha)
En cualquier momento se puede añadir un nuevo campo a una estructura o
eliminar un campo existente
Funciones para operar con estructuras
Ø
Ø
fieldnames(stc)
isstruct(ST), isfield(ST, s), rmfield(ST, s), getfield(ST, s), setfield(ST, s, v)
3
Vectores y/o matrices de celdas (cell arrays)
ETSII-UPM
q
Son vectores y/o matrices cuyos elementos pueden ser cada uno de
un tipo de dato diferente
Ø
Los elementos de un vector de celdas se definen con llaves { }
vc(1)={[1,2,3]}, vc(2)={['mi nombre']}, vc(3)={rand(3,6)}
vc{1}=[1,2,3], vc{2}=['mi nombre'], vc{3}=rand(3,6)
vc={[1,2,3], 'mi nombre', rand(3,6)}
Ø
q
Funciones para vectores de celdas
Ø
Ø
q
Es importante que el nombre vc no haya sido utilizado antes (usar clear vc;)
cell(m, n), celldisp(ca), cellplot(ca), iscell(ca)
num2cell(x)
Conversión entre vectores de celdas y estructuras
cell2struct(ca), struct2cell(stc)
ST = cell2struct(vc, {'vector','cadena','matriz'}, 2);
vcc= struct2cell(ST)';
Programación de Matlab
ETSII-UPM
q
Ficheros de comandos *.m
Ø
Ø
Ø
q
Se llaman mediante el nombre del fichero (sin la extensión)
Los comandos se ejecutan secuencialmente como si se introdujeran desde
teclado.
Las variables creadas pertenecen al espacio de trabajo del entorno desde el
que se ejecuta el fichero (no son visibles en las funciones, salvo la que lo ha
llamado)
Funciones *.m
Ø
Ø
Ø
Ø
Ø
Una función es una porción de código aislada del resto del programa
Hay funciones propias de Matlab y funciones definidas por el usuario
(funcname.m)
function [valores de retorno]=funcname(lista de argumentos)
La función recibe datos a través de la lista de argumentos y devuelve
resultados a través de los valores de retorno
También puede intercambiar información a través de variables globales,
declaradas como tales tanto en la función como en el programa que la llama
Las variables definidas dentro de la función (y los argumentos) son variables
locales a la función. Cada función tiene su propio espacio de trabajo
4
Funciones definidas por el usuario
ETSII-UPM
q
Se definen en ficheros *.m con el mismo nombre que la función
Ø
Ø
Los valores de retorno deben ser calculados en algún momento antes del fin
del fichero que defina la función
Los argumentos se reciben siempre por valor (si se modifican dentro de la
función, se saca una copia y se modifica la copia)
datos
function [ret1, ret2]=funcname(arg1, arg2, arg3,…)
...
resultados
ret1=...
...
ret2=...
q
q
Ejemplo de llamada: » [i,j]=funcname(A,B+C,H);
Las funciones de Matlab definidas en ficheros *.m
Ø
Ø
Ø
Admiten número variable de argumentos y de valores de retorno
Las variables nargin y nargout, accesibles dentro de la función, indican el
número de argumentos y valores de retorno con que la función ha sido llamada
varargin y varargout permiten utilizar cell arrays como datos y resultados
Programación en ficheros *.m
ETSII-UPM
q
Bifurcaciones if y switch
if condicion
sentencias
end
q
if condicion 1
sentencias 1
elseif condicion 2
sentencias 2
elseif condicion 3
sentencias 3
else % opcional
sentencias 4
end
switch expresion
case exp1
sentencias 2
case exp2
sentencias 3
otherwise % opcional
sentencias 4
end
Bucles for y while (sentencia break)
for i=1:inc:n
sentencias
end
for i=vector
sentencias
end
for i=1:m
for j=1:n
sentencias
end
end
while condicion
sentencias
end
5
Variables persistentes y variables globales
ETSII-UPM
q
Las variables persistentes:
Ø
Ø
q
Son variables locales de una función que conservan su valor entre las
sucesivas llamadas a la función (por defecto las variables locales se crean cada
vez)
Las variables persistentes se crean dentro de una función anteponiendo la
palabra persistent
Las variables globales:
Ø
Ø
Ø
Ø
Son variables visibles y utilizables desde el programa principal y desde todas
aquellas funciones que las declaren utilizando la palabra global
Las variables globales se utilizan para compartir información entre una o más
funciones y el programa principal, sin necesidad de pasarlas como argumentos
y/o valores de retorno
Las variables globales son consideradas peligrosas, porque si se produce un
error de programación pueden ser modificadas por quien no debe. Su uso debe
restringirse a los casos imprescindibles
Se les suelen asignar nombres largos y con mayúsculas (VELOCIDAD,
TIEMPO, ...), de modo que sean fácilmente distinguibles de las demás
variables
Gráficos en Matlab
ETSII-UPM
q
q
q
Matlab tiene capacidad de realizar gráficos 2-D y 3-D
Los gráficos se abren en ventanas especiales como la mostrada
Algunos parámetros gráficos pueden ser controlados desde la propia
ventana, por medio de menús, como se ve en la figura
6
Gráficos 2-D
ETSII-UPM
q
Función plot()
Ø
Ø
Ø
Ø
Ø
Ø
q
q
Su misión principal es dibujar un vector de valores y en ordenadas frente a otro
vector x en abscisas. Ambos vectores tienen el mismo número de elementos
Forma más habitual:
plot(x,y,'g+') % dibuja una línea verde con (+)
Colores:
y, m, c, r, g, b, w, k (black)
Tipos de línea:
- : -. -Marcadores;
. o x + * s d ^ v > < p h
Elementos que se pueden añadir (actúan sobre la figura activa): title('titulo'),
xlabel('tal'), ylabel('cual'), text(x,y,'texto'), gtext('texto'), grid
Los comandos hold on y hold off permiten dibujar varias líneas en
una misma figura. Por defecto, el nuevo dibujo sustituye al antiguo
Borrado selectivo de líneas o elementos gráficos. Se debe guardar el
id (handle) al crear la figura
Ø
Ejemplo:
miplot= plot(x,y), pause(5);
delete(miplot);
Gráficos 2-D (2)
ETSII-UPM
q
Otras formas de la función plot()
Ø
plot(y)
Ø
plot(x,A)
plot(A,x)
plot(A,B)
Ø
Ø
q
Dibuja los valores de y en ordenadas en función de los índices
1,2,...,n
Dibuja las columnas de A en ordenadas frente a x en abscisas
Dibuja las columnas de A en abscisas frente a x en ordenadas
Dibuja las columnas de B en ordenadas frente a las de A en
abscisas (A y B deben tener tamaños compatibles)
Comando subplot(): Indica en que
partición de la figura se va a dibujar
Ø
Ø
Forma general: subplot(m,n,i)
Ejemplo:
» x=0:pi/25:6*pi;
» y=sin(x); z=cos(x);
» w=exp(-x*.1).*y; v=y.*z;
» subplot(2,2,1), plot(x,y);
» subplot(2,2,2), plot(x,z);
» subplot(2,2,3), plot(x,w);
» subplot(2,2,4), plot(x,v);
7
Gráficos 2-D (3)
ETSII-UPM
q
Comando axis. Valores máximos y mínimos en los ejes. Tiene la
siguiente forma general:
axis([xmin, xmax, ymin, ymax])
q
Para cambiar el origen y la orientación:
axis('xy'), axis('ij')
q
xy
ij
Para que la escala sea igual en ambos ejes:
axis('equal')
q
Para que la zona representada sea cuadrada:
axis('square')
q
Para volver a los ejes por defecto
axis('normal')
q
Para guardar los ejes actuales antes de cambiarlos
v=axis;
q
Para restablecerlos más adelante
axis(v)
Gráficos 2-D (4)
ETSII-UPM
q
Función [x,y]=fplot('funcion', limites, 'cadena', tol)
Ø
Ø
Ø
Ø
Ø
q
'función' es el nombre del fichero *.m que define la función a dibujar
limites: vector de dos [xmin,xmax] o cuatro elementos
[xmin,xmax,ymin,ymax]
'cadena': control de color, marcadores y tipo de línea (como en plot())
tol: tolerancia de error relativo (por defecto 1e-03)
El resultado de fplot() se puede dibujar inmediatamente (sin recoger valores de
retorno) o posteriormente con plot(), pasándole los valores de retorno
recogidos de fplot()
Introducción de puntos con el ratón: función ginput()
Ø
Ø
Ø
[x,y]=ginput
introduce los puntos que se van clicando hasta que se
pulsa intro
[x,y]=ginput(n) introduce los n puntos que se clican a continuación
[x,y,bot]=ginput devuelve también un vector de enteros con información
sobre el botón que se ha pulsado
8
Gráficos 2-D (5)
ETSII-UPM
q
Forma general de dibujo de líneas: función line()
Ø
Ø
Ø
Ø
q
line([xini, xend]', [yini, yend]', 'color', 'g')
line([xini1 xini2; xend1 xend2], ([yini1 yini2; yend1 yend2]); permite
también dibujar varias líneas a la vez:
line([X], [Y]); cada columna de [X] contiene la x inicial y final de un punto, y
lo mismo las columnas de [Y] con las coordenadas y
Control de las características de la línea: se realiza por medio de pares
parámetro/valor, como por ejemplo:
line(x,y,'Color','r','LineWidth',4,'MarkerSize',12,'LineStyle','—
','Marker','*')
Dibujo de polígonos
Ø
Ø
Ø
Ø
Con la función plot()
Con llamadas repetidas a la función line()
Con la función fill(x,y,c). En este caso el polígono se rellena con el color c. Si
c es un vector de colores de la misma dimensión que x e y se rellena
interpolando.
Con llamadas a la función patch(x,y,c)
Ventanas y movies
ETSII-UPM
q
Control de ventanas. Función figure. Ventana activa
Ø
Ø
Ø
Ø
q
figure, figure(n) Crean una nueva ventana activa, si no existe. Se le asigna
el número indicado o un número consecutivo
close, close(n)
Cierran la ventana activa o la número n
clf, gcf
Borran el contenido de la ventana activa u obtienen el
número de la ventana activa
figure(gcf)
Trae a primer plano la ventana activa
Creación de películas o movies:
M=moviein(12)
x=-2*pi:pi/24:2*pi; inc=pi/8;
for i=1:12
y=sin(x+i*inc);
plot(x, y);
M(:,i)=getframe; % captura el frame y lo guarda
end
q
Para ver la película
Movie(M, 10, 15)
9
Gráficos 3-D
ETSII-UPM
q
La función plot3(x,y,z) permite dibujar líneas en un espacio 3-D
Ø
q
Se pueden definir colores, tipos de línea y marcadores de modo similar a 2-D
Función line(): dibuja líneas entre puntos en el espacio 3-D
Ø
Existe una versión 3-D de la función line() completamente análoga a la 2-D
line([xini,xend]', [yini,yend]', [zini,zend]','color','k');
line(X,Y,Z,'color','b');
q
Función patch(): dibuja polígonos en el espacio 3-D
patch(X,Y,Z,C);
q
q
Las funciones mesh(), surf() y contour() permiten dibujar superficies
3-D con distintos tipos de representación
Control de la dirección de observación: función view(az, el).
Ø
Los ángulos se definen en grados. Por defecto: az = -37.5, el = 30
Gráficos 3-D (2)
ETSII-UPM
q
Funciones plot3(x, y, z), plot(x, y, z, 's'), mesh(X,Y,Z) y surf(X,Y,Z)
clear all, close all function z=test3d(x,y)
z = 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) ...
- 10*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) ...
x=[-3:0.4:3]; y=x;
- 1/3*exp(-(x+1).^2 - y.^2);
[X,Y]=meshgrid(x,y);
Z=test3d(X,Y);
subplot(2,2,1)
figure(gcf),fi=[0:pi/20:6*pi];
plot3(cos(fi),sin(fi),fi,'g');
pause(3);
subplot(2,2,2)
mesh(Z)
pause(3)
shading flat
shading interp
shading faceted
subplot(2,2,3)
figure(gcf), surf(Z)
pause(3)
subplot(2,2,4)
contour3(Z,16)
10
Gráficos 3-D (3)
ETSII-UPM
q
Función [X,Y]=meshgrid(x,y);
Ø
Ø
Sirve para crear matrices con las coordenadas x e y de todos los puntos de la
retícula. Ejemplo:
x=[1, 2, 4];
y=[1, 3]';
[X,Y]=meshgrid(x,y)
X =
1
2
4
1
2
4
Y =
1
1
1
3
3
3
En las filas de la matriz X se repite al vector x tantas veces como elementos
tiene y. En las columnas de la matriz Y se repite al vector y tantas veces como
elementos tiene x.
Gráficos 3-D (4)
ETSII-UPM
q
Mapas de colores: colormap(name)
Ø
Ø
Ø
Ø
Ø
Un color se puede definir por un nombre (los colores básicos:
'y','m','c','r','g','b',…) o por medio de tres números entre 0 y 1 (las componentes
RGB)
Un mapa de colores es una matriz de tres columnas (componentes RGB),
cuyas filas representan colores. Por defecto tienen 64 filas.
Cada mapa de colores tiene un nombre y un estilo que caracteriza sus colores
Algunos mapas de colores estándar: hsv, hot, gray, bone, copper, pink, white,
flag, lines, colorcube, vga, jet, prism, cool, autumn, spring, winter, summer
Un mapa de colores se puede ver con las sentencias
» colormap(copper)
» pcolor([1:65;1:65]')
Ø
q
Al dibujar una figura con el mapa de colores activo los valores máximos se
dibujan con los colores altos del mapa y los valores bajos con los colores bajos
Función caxis([cmin,cmax])
Ø
Cambia la asignación de colores, ajustando cmin y cmax a los valores
máximos y mínimos del mapa de colores (en lugar de a los valores más altos o
más bajos)
11
Ejemplo: Simulación movimiento 2-D
ETSII-UPM
q
q
q
Se pretende estudiar el movimiento 2-D
de un bloque rectangular sometido a la
acción de la gravedad
El sistema tiene 3 grados de libertad
Ecuaciones diferenciales del movimiento:
mx&& = 0
my&& = −mg
Iϕ&& = 0
que se pueden reducir a:
&&
&&
x=0
y = −g
q
ϕ&& = 0
Matlab sólo integra ecuaciones diferenciales
de orden 1. Definiendo:
u ≡ x&
v ≡ y&
ω ≡ ϕ&
las ecuaciones del movimiento se pueden
expresar como se indica en el recuadro
y
y
x
ϕ
x
y
x
x& = u 
y& = v 
ϕ& = ω 
 y& = f (y, t )
u& = 0 
v& = − g 

ω& = 0 
Ejemplo: Simulación movimiento 2-D (2)
ETSII-UPM
q
Los integradores de Matlab se utilizan en la forma siguiente:
[t, Y] = ode45('deriv', tspan, y0, options);
donde:
Ø
Ø
Ø
Ø
Ø
Ø
Ø
q
t es un vector con los instantes de tiempo en los que se dan resultados
Y es una matriz cuyas filas contienen los 6 resultados en cada instante
ode45 es el nombre de una función que utiliza el método de Runge-Kutta
'deriv' es una cadena de caracteres con el nombre de una función que calcula
la derivada del vector de estado
tspan es un vector con los instantes de tiempo en que se desean resultados
y0 es un vector columna de seis elementos con las velocidades y posiciones
iniciales
options es una estructura que permite controlar algunos factores de la
integración numérica
Una vez terminada la integración numérica hay que representar
gráficamente los resultados
12
Ejemplo: Simulación movimiento 2-D (3)
ETSII-UPM
q
Las coordenadas de los vértices
del bloque deben transformarse
a coordenadas generales
x = cos ϕ ⋅ x − sin ϕ ⋅ y 

y = sin ϕ ⋅ x + cos ϕ ⋅ y 
 x  cos ϕ
 =
 y   sin ϕ
q
− sin ϕ   x 
 
cos ϕ   y 
y
y
x
x
o bien,
P
x
y
y ϕ
ϕ
x
r = Rr
Para todos los puntos del bloque
Ø
Ø
Ø
PL=[ a -a -a a a
b b -b -b b];
PG=R*PL+g*ones(1,size(PL,2);
line(PG(1,:),PG(2,:),'color','k');
13
Descargar