ST OCE Matlab 03 2012
ST OCE Matlab 03 2012
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.
1. Computación y matemáticas
2. Desarrollo de algoritmos
3. Modelación y simulación
5. Aplicaciones graficas
Consideraciones:
Ejemplo 1.1
help inv
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
ls: El comando ls muestra todo los archivos, carpetas, datos en el directorio de trabajo
Ejemplo 1.4
ls
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
Página 4
2.- Vectores y matrices: definición y operaciones
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
1 2 3 4 5 6 7 8 9 10
a = 1:3:15
a =
1 4 7 10 13
A = [1 2 3 4; 5 4 6 7; 1 4 8 5]
A=
1 2 3 4
5 4 6 7
1 4 8 5
Página 5
A = [1 2 3 4
5 4 6 7
1 4 8 5]
A=
1 2 3 4
5 4 6 7
1 4 8 5
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];
59 131
86 192
15 36
44 156
e =
15 44
36 156
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 1 6 26 19 24
3 32 7 21 23 25
31 9 2 22 27 20
8 28 33 17 10 15
30 5 34 12 14 16
4 36 29 13 18 11
ej_31 = mat(1:3,:)
ej_31 =
35 1 6 26 19 24
3 32 7 21 23 25
31 9 2 22 27 20
ej_32 =
1 26 24
9 22 20
5 12 16
ej_33 = mat(:,5:6)
ej_33 =
19 24
23 25
27 20
10 15
14 16
18 11
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 9 2 22 27 20
8 28 33 17 10 15
30 5 34 12 14 16
4 36 29 13 18 11
Función
Ejemplo 4.1.
ej_41 = sum(M)
ej_41 =
Página 8
ej_42 = max(M)
ej_42 =
ej_44 = det(M)
ej_44 =
-0.0194
ej_45 = inv(M)
ej_45 =
Identidad = M * ej_45
Identidad =
ej_46 = corrcoef(M)
ej_46 =
MATRICES PREDEFINIDAS
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 0 0 0
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
ej_49 = rand(3,8)
ej_49 =
Página 10
Tabla 4.3 Funciones trigonométricas
FUNCIONES TRIGONOMETRICAS
ej_51 = 0/0
Warning: Divide by zero.
ej_51 =
NaN
Ejemplo 5.1
A = [ 2 6 58 9 NaN NaN 5 8 9 4 NaN 25 36
10 NaN 89 9 NaN 5 8 9 4 NaN 25 NaN 88
2 6 58 9 NaN NaN 5 NaN 9 4 NaN 25 25
10 NaN 89 9 NaN 5 8 9 4 NaN 25 NaN 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.
Página 11
val_nan = isnan(A)
val_nan =
0 0 0 0 1 1 0 0 0 0 1 0 0
0 1 0 0 1 0 0 0 0 1 0 1 0
0 0 0 0 1 1 0 1 0 0 1 0 0
0 1 0 0 1 0 0 0 0 1 0 1 0
posiciones =
2 2
4 2
1 5
2 5
3 5
4 5
1 6
3 6
3 8
2 10
4 10
1 11
3 11
2 12
4 12
I = find(isnan(vec)==0);
vec = vec(I);
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:
if condició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
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:
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);
Página 14
n_desv_2 = n_desv_2 + 1;
vec_2std = [vec_2std; i y(i)] ;
end
if y(i) > 3*desviacion
n_desv_3 = n_desv_3 + 1;
vec_3std = [vec_3std; i y(i)] ;
end
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];
resultado:
--------------------------------------
Valores Desviacion estandar
--------------------------------------
7 1-std, valor = 7.32841
2 2-std, valor = 14.65682
2 3-std, valor = 21.98523
--------------------------------------
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 = [min(y) max(y) mean(x) std(x)];
case 2
matriz = [min(y) max(y) mean(x) std(x)] .^2 ;
case 3
matriz = [cumsum(x)];
otherwise
disp(' El valor no es 1 ,2 o 3')
Página 15
return
end
resultado:
matriz =
Ejemplo 6.4:
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:
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.
Ejemplo 7.2:
fprintf(' Salida en pantalla de la matriz M\n')
fprintf(' -----------------------------------------------\n')
fprintf(' Col1 Col2 Col3 Col4 Col5 Col6 \n')
fprintf(' -----------------------------------------------\n')
fprintf(' %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f\n',M')
fprintf(' -----------------------------------------------\n')
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 = salida de números enteros
%(n)s = salida de cadena de caracteres (string)
%(m.n)f = salida con punto flotante.
%(m.n)e = salida exponencial.
Ejemplo 7.3:
fprintf(' El valor de pi es = %9.7f \n',pi)
fprintf(' El valor de pi es = %9.7e \n',pi)
fprintf(' La parte entera de pi es = %d \n',fix(pi))
fprintf(' 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
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,:))
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')
load nombre.extensión
nombre_variable = load(nombre.extension);
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')
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);
1 17.230 34.4540
5 16.180 34.4410
10 15.030 34.3530
15 12.850 34.2300
30 11.560 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
var = load('ejemplo_save.mat');
var
var =
dat_1 = var.var_1
dat_2 = var.var_2
dat_1 =
dat_2 =
0.0591
0.1183
0.1773
0.2364
0.2954
0.3544
0.4132
0.4720
0.5307
0.5892
file = 'g:\sam\TXT\cursos\ADG_513421\clase_01\ctd_test_01.cnv';
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);
%[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 Grafico en dos dimensiones
bar Grafico de barras
hist Grafica histogramas
feather Grafica diagrama de vectores
loglog Grafica con escalas logarítmicas en ambos ejes
semilogx Grafica en escala logarítmica en el eje x
semilogy Grafica en escala logarítmica en el eje y
polar Grafica en coordenadas polares.
contour Grafica contornos o isolineas.
stem Grafica datos discretos
quiver Muestra vectores 2D especificados por las componentes (u,v)
quiver3 Muestra vectores 3D especificados por las componentes (u,v,w)
Uso del PLOT: la función plot sirve para graficar figuras en escala lineal en ambos ejes. Su
es la siguiente estructura:
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.
Continua = -
Guiones = --
Punteada = :
Estrellas = *
Cruz = x
Guiones y puntos = -.
b = azul
r = rojo
k = negro
g = verde
m = magenta
y = amarillo
c = turquesa
w = blanco
propiedad = 'linewidth',n
propiedad = 'markersize',n
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
H = figure(valor)
H = figure('propiedad',valor, ..., 'propiedad(n),valor(n))
figure numero_figura
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 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:
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');
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)
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')
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)
[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.
% 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);
Estructura:
function [valores de retorno] = nombre_funcion ( valores de entrada )
function nombre_funcion ( valores de entrada )
function nombre_funcion
Los valores tanto de entrada como de retorno deben estar separados por comas. La función se
almacena con extensión (.m).
% 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)
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);
meses = ['Ene';'Fre';'Mar';'Abr';'May';'Jun';'Jul';
'Ago';'Sep';'Oct';'Nov';'Dic'];
str = meses(mes,:);
end
Uso de la funcion:
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);
r = covm/sqrt(stdu*stdv);
Página 30
return
Uso de la function:
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:
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 : datafun
Análisis estadístico : stats
Análisis de señales : signal
Análisis de wavelet : wavelet
Funciones especiales : specfun
Funciones matriciales : matfun, elmat , sparfun
Gráficos : graph2d , graph3d,
specgraph, graphics
Interpolación y polinomios : polyfun
Interpolación spline : splines
Integrales y ecuaciones diferenciales : funfun
Información general : general
Manejo de string : strfun
Manejo de archivos : iofun
Mapas : map, mapproj
Modelos : 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
Hypothesis Tests.
ranksum - Wilcoxon rank sum test (independent samples)
signrank - Wilcoxon sign rank test (paired samples)
signtest - Sign test (paired samples)
ztest - Z test
ttest - One sample t test
ttest2 - 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