Anda di halaman 1dari 55

Ing.

William Chauca Nolasco

ESTRUCTURA DE DATOS
Las estructuras surgen para crear variables que puedan contener nmeros y textos al
mismo tiempo.
Las estructuras son arreglos en MATLAB con nombres contenedores de datos llamados
campos.
Los campos de una estructura pueden contener cualquier tipo de dato
Trabajador

.nombres
Luis Mendoza
Salas

.salario
750

.horas
[9 8 10 9 10;
8 8 8.5 9 8.5;
9 8 8.5 9 8;
10 9 10 8 9]

Ingresando la estructura en el Workspace de MatLab


>> trabajador.nombre='Luis Mendoza Salas
trabajador =
nombre: 'Luis Mendoza Salas'
>> trabajador.salario=750
trabajador =
nombre: 'Luis Mendoza Salas'
salario: 750
>> trabajador.horas=[9 8.5 10 9 10;8 8 8.5 9 8.5;9 8 8.5 9 8;10 9 10 8 9]
trabajador =
nombre: 'Luis Mendoza Salas'
salario: 750
horas: [4x5 double]

Doble Clic

Haciendo doble clic sobre el campo horas

Una vez ingresada la data de una estructura, es posible recuperar la


informacin de algn campo.

>> data1=trabajador.horas
data1 =
9.0000
8.0000
9.0000
10.0000

8.5000
8.0000
8.0000
9.0000

10.0000
8.5000
8.5000
10.0000

9.0000 10.0000
9.0000 8.5000
9.0000 8.0000
8.0000 9.0000

VISUALIZAR UNA MATRIZ DEL CAMPO HORAS QUE SEAN IGUAL A 9 HORAS
TRABAJADAS
>> for i=1:4
for j=1:5
if trabajador.horas(i,j)==9
xx(i,j)=trabajador.horas(i,j);
end
end
end
>> xx
xx =
9
0
9
0

0
0
0
9

0
0
0
0

9
9
9
0

0
0
0
9

Comando STRUCT permite crear estructuras o arreglos de estructuras definiendo el nombre


de las estructura y los campos con sus respectivos valores

>> Agenda=struct('nombre','Carlos Santa Maria','profesion','Abogado','contactos',...


[123456789 987654321 253647899])
Agenda =

nombre: 'Carlos Santa Maria'


profesion: 'Abogado'
contactos: [123456789 987654321 253647899]

OTROS EJEMPLOS:

>> fieldnames(Agenda)
ans =
'nombre'
'profesion'
'contactos'
>> fieldnames(trabajador)
ans =
'nombre'
'salario'
'horas'
>> isfield(Agenda,'profesion')
ans =
1
>> isstruct(Agenda)
ans =
1

>> Nota=struct('exa1',10,'exa2',12,'susti',11','condicion','Aprobo')
Nota =
exa1: 10
exa2: 12
susti: 11
condicion: 'Aprobo'
>> rmfield(Nota,'condicion')
ans =
exa1: 10
exa2: 12
susti: 11

>> getfield(Nota,'exa1')
ans =
10

>> clase=struct('curso','primero','grupo','A', ...


'alum', struct('nombre','Juan', 'edad', 19))
clase =
curso: 'primero'
grupo: 'A'
alum: [1x1 struct]
>> clase.alum(2).nombre='Mara';
>> clase.alum(2).edad=17;
>> clase.alum(2)
ans =
nombre: 'Mara'
edad: 17
>> clase.alum(1)
ans =
Las estructuras se generalizan con las clases y los
nombre: 'Juan'
objetos
edad: 19
>>

>> AA(:,:,1)=[1 2 3; 4 5 6] % matriz inicial


AA =
1 2 3
4 5 6
>> AA(:,:,2)=[2 3 4; 5 6 7] % se aade una segunda matriz
AA(:,:,1) =
1 2 3
4 5 6
AA(:,:,2) =
2 3 4
5 6 7

OTRO EJEMPLO
>> HM(:,:,1) = [1 2 3; 4 5 6]; % definimos la primera capa
>> HM(:,:,2) = [7 8 9; 10 11 12] % definimos la segunda capa
HM(:,:,1) =
1 2 3
4 5 6
HM(:,:,2) =
7 8 9
10 11 12

>> BB=randn(2,3,2)
BB(:,:,1) =
0.5377 -2.2588 0.3188
1.8339 0.8622 -1.3077
BB(:,:,2) =
-0.4336 3.5784 -1.3499
0.3426 2.7694 3.0349

>> A=zeros(2,3); B=ones(2,3);


>> A
A=
0 0 0
0 0 0

>> cat(2,A,B)
ans =

>> B
B=
1
1

>> cat(3,A,B)

1
1

1
1

>> cat(1,A,B)

0
0

0
0

0
0

ans(:,:,1) =
0
0

0
0

0
0

ans =
0
0
1
1

0
0
1
1

0
0
1
1

ans(:,:,2) =
1
1

1
1

1
1

1
1

1
1

1
1

Las siguientes funciones de MATLAB se pueden emplear tambin con hipermatrices:

size() devuelve tres o ms valores (el n de elementos en cada dimensin)


ndims() devuelve el nmero de dimensiones
squeeze() elimina las dimensiones que son igual a uno
reshape() distribuye el mismo nmero de elementos en una matriz con distinta
forma o con distintas dimensiones

permute(A,v) permuta las dimensiones de A segn los ndices del vector v


ipermute(A,v) realiza la permutacin inversa

>> size(HM)
ans =
2 3 2
>> size(BB)
ans =
2 3 2
>> ndims(BB)
ans =
3
>> ndims(A)
ans =
2

POLINOMIOS

>> a=[3,-0.5,0,1,-5.2]
a=
3.0000 -0.5000
>> x=1;
>> f=polyval(a,x)
f=
-1.7000

0 1.0000 -5.2000

>> f1=polyval([3 -0.5 0 1 -5.2],x)


f1 =
-1.7000

>> x=0:5/200:5;
>> a=[-1 0 3 -2.5 0 -2.5];
>> g=polyval(a,x);

>> g
ans =
1.0e+003 *
-0.0025
-0.0025
-0.0025
-0.0025
.
.
>> plot(x,g),title('FUNCION POLINOMICA')

RACES
Un polinomio se representa por un vector fila con sus coeficientes en orden descendiente,
no debemos olvidar colocar los trminos con coeficiente nulo.

Para encontrar las races de un polinomio p usaremos la funcin roots (p).


Si conocemos las races de un polinomio es posible construir el polinomio asociado
mediante la funcin poly (r).
Matlab trabaja con los polinomios como vectores fila y con las races como vectores
columnas
Ejemplos:
>> p = [1 -9 13 9 -14] %representa al polinomio
p=
1 -9 13 9 -14

>> roots (p)


ans =
7.0000
-1.0000
2.0000
1.0000

%raices del polinomio

>> poly (ans) % devuelve el polinomio generado por esas cuatro races
ans =
1.0000 -9.0000 13.0000 9.0000 -14.0000

OTRAS FUNCIONES

GRAFICAS X-Y CON DOS EJES Y

Sea las siguientes ordenes en MatLab.

x=0:pi/20:2*pi;
y1=sin(x);
y2=exp(x);
plot(x,y1,x,y2)
title('Ejes Y con escala
Sencilla')
xlabel('Angulo')
Observamos en la grafica que sen(x) parece que corre en linea
recta a lo largo de x=0, esto es debido a la escala.

Funcin PLOTYY
Esta funcion le permite crear una grafica con dos ejes Y; el de
la izquierda para el primer conjunto de pares ordenados y el de
la derecha para el segundo conjunto de pares ordenados.

clear all
clc
x=0:pi/20:2*pi;
y1=sin(x);
y2=exp(x);
plotyy(x,y1,x,y2)
title('Dos Ejes Y escalados')
xlabel('Angulo')

La funcion PLOTYY puede crear algunos tipos diferentes de


graficas al agregar una cadena con el nombre del tipo de
grafica despus del segundo conjunto de pares ordenados
observar y escribir el siguiente codigo.
clear all
clc
x=0:pi/20:2*pi;
y1=sin(x);
y2=exp(x);
%subplot(2,1,1)
plotyy(x,y1,x,y2, 'semilogx')
title('Grafica semilog en el eje X')

INTERPOLACIN

INTERPOLACION LINEAL

>> %Almacenamos la informacin en vectores


>> x=0:5;
>> y=[0 20 60 68 77 110];

>> y1=interp1(x,y,2.6)
y1 =
64.8000
>> y2=interp1(x,y,4.9)
y2 =
106.7000

>>
>>
>>
>>

x(:,1)=(0:5)';
y(:,1)=[0 20 60 68 77 110]';
y(:,2)=[0 25 62 67 82 103]';
y(:,3)=[0 52 90 91 93 96]';

>> temps=interp1(x,y,2.6)
temps =
64.8000 65.0000 90.6000

INTERPLACION DE SPLINES CUBICAS

>> x=0:5;
>> y=[0 20 60 68 77 110];
>> temp=interp1(x,y,2.6,'spline')
temp =
67.3013

Para dos instantes cualquiera:


>> temp1=interp1(x,y,[2.6 4.9],'spline')
temp1 =
67.3013 105.2020

%%interpolacion lineal y spline cubica


clear all
clc
x=0:5;
y=[0 20 60 68 77 110];
new_x=0:0.1:5;
new_y1=interp1(x,y,new_x,'linear');
new_y2=interp1(x,y,new_x,'spline');
plot(new_x,new_y1,new_x,new_y2,x,y,'o')
title('Interpolacion Lineal con Spline Cubica')
xlabel('x'), grid on

Este programa ilustra como se puede ajustar una


curva o realizar una interpolacin
MATLAB permite ajustar curvas por el mtodo de
los mnimos cuadrados mediante la instruccin
(polyfit)
c = polyfit(x,y,n)
Donde:
c = coeficientes del polinomio ajustado a los
datos
x = datos de (x)
y = datos de (y)
n = el orden del polinomio ajustado a los datos

clear all
clc
x=[1:1:20];
y=[-0.23,2,6,12.1,25.8,18,4,-11,-20,-8,0.026,11,14,-0.47,-15,-35,-25,-10,0,26];
n=8;
c1=polyfit(x,y,n);
c1_val=polyval(c1,x);
plot(x,y,'ro',x,c1_val,'b-')
ylabel('VALORES DE (y)')
xlabel('VALORES DE (X)')

ESTE PROGRAMA ILUSTRA COMO SE PUEDE REALIZAR UNA INTERPOLACIN


MTODO APROXIMADO GRFICO

clc
close
clear
x=1:2.35:15; % GENERACIN DE LA VARIABLE MONTONA, UNIFORM
% ESPACIADA
y=4.25+x.^(.2+0.0005.*x);
m=[x',y'];
xi=5.0;
yi=4.25+xi.^(.2+0.0005.*xi);
disp('SE DISPONE DE UNA TABLA CON VALORES DE (X) y DE (Y)')
disp('SE DESEA CONOCER EL VALOR DE (Y) PARA (X=5.0)')
disp(' TABLA DE VALORES')
disp('__________________ ')
disp(' ')

POR EL

disp(' X
Y ')
disp('_________________ ')
disp(m)
disp(' ')
input('PRESIONAR enter PARA CONTINUAR')
disp(' ')
disp(' ')
disp('SE UTILIZAR EL MTODO GRFICO APROXIMADO,')
disp('PARA ELLO SE GRAFICAN LOS VALORES DE LA TABLA.')
disp('LUEGO,CON AYUDA DEL BOTN DE AMPLIACIN, (zoom in)')
disp('EN LA BARRA DE BOTONES,DE LA VENTANA DE LA FIGURA,')
disp('SE AMPLIFICA LA GRFICA')
disp('COLOCANDO EL PUNTERO DEL RATN,EN UN PUNTO SOBRE, ')
disp('LA CURVA,CORRESPONDIENTE AL VALOR DE X=5.0,')
disp('Y PRESIONANDO EL BOTN DE LA IZQUIERDA,DEL RATN ')
disp('TANTAS VECES COMO SE QUIERA AMPLIFICAR LA GRAFICA')
disp('AL FINAL,SE PUEDE LEER EL CORRESPONDIENTE VALOR DE (Y)')

disp(' ')
disp('PARA TENER IDEA DEL ERROR QUE SE COMETE CON ESTE MTODO')
disp('SE INDICAR A CONTINUACIN EL VALOR VERDADERO DE (Y)
PARA')
disp('(X=5.0)')
fprintf('PARA X=5.0 EL VALOR DE Y=%2.4f',yi)
disp(' ')
disp(' ')
disp('PARA TRABAJAR CON LA GRFICA, PULSE enter')
input('')
plot(x,y,'ro',x,y,'b-')
ylabel('VALORES DE Y ')
xlabel('VALORES DE X ')
title('GRFICA DE Y versus X, PARA X=5.0 VALOR VERDADERO DE
Y=5.6353 ')
grid on