Você está na página 1de 119

Quien no se resuelve a cultivar el hbito de pensar, se pierde el mayor placer de la vida

Thomas A. Edison

Procesamiento de seales, imgenes y visin artificial con MatLab

ESQUEMA BSICO DEL PROCESAMIENTO DE DATOS

TCNICAS DE ANLISIS:

Tema RESUMEN BSICO DE MATLAB AMBIENTE DEL MATLAB 7.0

Tema RESUMEN BSICO DE MATLAB Tema I.


Operaciones con vectores y matrices

Sumario
2.1. Definicin de matrices desde el teclado
2.2. Operaciones con matrices 2.3. Matrices predefinidas 2.4. Direccionamiento de matrices y vectores. El operador (:) y la funcin (cat)

2.5. Operadores relacionales


2.6. Operadores lgicos

Definicin de un vector
Vector fila: elementos separados con comas (,) o con espacios:

Vector columna: elementos separados con punto y coma (;) :


Fila a columna y viceversa: con la transpuesta ( )

Ejemplos a) desde lnea de comandos, b) prog.:


Vector fila Vector columna

El operador (:)
El operador (:) es utilizado para especificar rangos, su forma de empleo es muy simple y sus beneficios inmensos.
Forma de empleo: <vector>=[val_ini : paso : val_fin];

Ejemplo:

Definicin de matrices
Las matrices se definen por filas, los elementos de la fila se separan por espacios o comas (,) mientras que las filas van separadas por punto y coma (;)
Ejemplos: A=[1,2,3; 4,5,6; 7,8,9] Se ve en pantalla:

A=[1 2 3; 4 5 6; 7 8 9]

Definicin de matrices
Observacin 1 Una vez definida la matriz esta pasa a su espacio de trabajo (Workspace) y estar disponible para realizarce cualquier operacin.
Ejemplo:

Definicin de matrices
Observacin 2 MatLab introduce por defecto una variable llamada (ans) de answer sobre la cual tambin se puede operar.
Ejemplo:

Definicin de matrices
Observacin 3 En MatLab se permite la creacin de matrices vacas.
Ejemplo:

Cmo acceder a los valores?


Los elementos de una matriz se acceden poniendo los 2 ndices entre parntesis separados por coma (Ej. A(1,2)).
Ejemplo: A(1,2)

Cmo acceder a los valores?


Observacin 1 Si estamos trabajando con vectores bastara colocar un solo ndice.
Ejemplo:

Operaciones
Operaciones con escalares:
v+k adicin o suma v-k sustraccin o resta v*k multiplicacin v/k divide por k cada elemento de v k./v divide k por cada elemento de v v.^k potenciacin cada componente de v esta elevado a k k.^v potenciacin k elevado cada componente de v VECTORES:

A+B=[a1+b1 a2+b2 ... an+bn]


A-B =[a1-b1 a2-b2 ... an-bn]

A .* B=[a1.b1 a2.b2 ... an.bn] A y B deben ser horizontales o verticales. Si A=[fila] y B=[Columna]: Producto punto = A*B

A./ B=[a1/b1 a2/b2 ... an/bn]


A .^ n1=[a1^n1 a2^n1... an^n1 ]

MATRICES: sin el punto

A*B

A/ B

A ^ n1

Operaciones
Ejemplo:

Matrices predefinidas
eye(n) zeros(n) zeros(n,m) Matriz unitaria (n x n)

Matriz de ceros (n x n)
Matriz de ceros (n x m) Matriz de unos (n x n) Matriz de unos (n x m)

ones(n)
ones(n,m) rand(n) rand(n,m) linspace (x1,x2,n)

Matriz de nmeros aleatorios entre 0 y 1 (n x n)


Matriz de nmeros aleatorios entre 0 y 1 (n x m) Genera un vector con n valores entre x1 y x2 igualmente espaciados matriz mgica (n x n): 1 hasta N^2 con sumas iguales en filas, columnas y diagonales.

magic(n)

Operaciones con matrices


Ejemplos:

Operaciones con matrices


Ejemplos:

El operador (:)
El operador (:) se muestra mucho ms potente cuando se trabaja con matrices.

El operador (:)
Extraccin de submatrices.

El operador (:)
Extraccin de una columna.

El operador (:)
Extraccin de una fila (end = ltima).

El operador (:)
Eliminacin de una columna.

La funcin (cat)
La funcin (cat) se emplea para concatenar matrices a lo largo de una dimensin especificada. Al igual que el operador (:) es de una gran utilidad cuando se trabaja con matrices.

La funcin (cat)
Ejemplo (1: abajo; 2: a la derecha):
B

Operadores relacionales
< <= > >= == ~= Menor que Menor o igual a Mayor que Mayor o igual a Igual a Distinto de

Operadores lgicos
&& || ~ xor Conjuncin Disyuncin Negacin Disyuncin exclusiva

ECUACIONES LINEALES
Dado un sistema algebraico de ecuaciones lineales de la forma Ax=B. Lo resolveremos por mtodos clsicos y con funciones propias de matlab Comandos: >>det(A) %determinante de una matriz cuadrada >>inv(A) %inversa de una matriz cuadrada

Ecuaciones lineales________________________________

Ejemplos de resolucin de un sistema Ax=B: Ejemplo: Resolver el sistema: X1+2 X2+3 X3 = 4 2X1+3 X2+4 X3 = 5 4X1+2 X2+5 X3 = 1

Ecuaciones lineales________________________________

Resolucin: Regla de Cramer


Resolucin: A=[1 2 3;2 3 4;4 2 5] B=[4;5;1]; D1=A;D1(:,1)=B D2=A;D2(:,2)=B D3=A;D3(:,3)=B x=[det(D1);det(D2);det(D3)]/det(A)

Ecuaciones lineales________________________________

La solucin por Cramer es tediosa y poco eficaz.

Una primera posibilidad ms cmoda. Ainv=inv(A)


x=Ainv*B
Otra solucin sera utilizar la divisin matricial X=A\B A\B, produce un resultado aunque la matriz no sea cuadrada y aunque no sea invertible. Por ejemplo si el sistema esta sobredeterminado (ms ecuaciones que incgnitas) se calcula la solucin que minimiza la norma 2 de Ax-b (solucin de mnimos cuadrados)

Ejemplo de repaso:
%Definicin vector A=(1:2:11),B=(1:6) X=[3;6;7;12;1;5],Y=B' %operaciones con escalares C=A-2 D=3*Y-1 %operaciones entre vectores E=2*A+B F=A.*B G=Y./X H=X.^2 %definicin de matrices I=[1 2 3 4;5 6 7 8;9 10 11 12] J=[5:8;8:11;11:14] K=zeros(4) L=ones(2,4) M=rand(4,4) %Manipulacin de matrices N=I(2,3) %obtiene valor de la F2, C3 O=I(1:2,2:3) %extrae las primeras 2F y las cols 2 y 3 de I col1=I(:,1) % extrae la primera columna de la matriz union1=[L;K], union2=[I J] % unin de matrices %Operaciones con matrices sum=I+J mult=I*M pot=M^2 T=I.' deter=det(M) %Sistema de ecuaciones

%Regla de Cramer Q=[1 2 3;2 3 4; 4 2 5] R=[4;5;1] D1=[R Q] D1=[4 2 3;5 3 4;1 2 5]; D2=[1 4 3;2 5 4;4 1 5]; D3=[1 2 4;2 3 5;4 2 1]; S=[det(D1),det(D2),det(D3)]/det(Q)
%Inversa Q_inv=inv(Q) sol=Q_inv*R

POLINOMIOS
Los polinomios se representan en matlab por un vector fila de dimensin n+1 siendo n el grado del polinomio. Dado un polinomio

se representa por >> pol1=[1 0 2 0] para el clculo de las races de un polinomio existe el comando roots. >>raices=roots(pol1) (da un vector columna, aunque pol1 es un vector fila)

x3+2x

Polinomios______________________________________

Un polinomio puede ser reconstruido a partir de sus races con el comando poly >> p=poly(raices) (da un vector fila) ** en caso de que el argumento de poly fuera una matriz obtendramos como resultado el polinomio caracterstico de la matriz. As mismo si queremos calcular los autovalores de la matriz bastara con calcular las races del polinomio caracterstico.
Ejemplo1: pol2=[2 4 0 1]; % definicin del polinomio 2x3+4x2+1 raices=roots(pol2) % clculo de sus races pol2_n=poly(raices) % reconstruccin del polinomio real(pol2_n) % qu pas? Ejemplo2: A=[1 2 3 ; 2 3 4; 4 2 5]; p=poly(A) % pol. caracterstico roots(p) % autovalores de A

Polinomios______________________________________

Para calcular el valor de un polinomio p en un punto dado x1 basta con utilizar el comando polyval >>y=polyval(p,x1) Ejemplo: Evaluar el polinomio x3-x2-x+1 en el punto 2 p=[1 1 1 1] % definicin del polinomio x3-x2-x+1 polyval(p,2) Ejemplo: Ahora evaluarlo en todo un rango de puntos x=-2:0.1:2; Y=polyval(p,x); Para multiplicar y dividir polinomios tenemos los comandos especiales conv(p1,p2) y deconv(p1,p2) Ejemplo5: p1=[1, -2, 1]; p2=[1,1]; p3=conv(p1,p2) p4=deconv(p3,p2) [p4,r]=deconv(p3,p2) % resto de la divisin

Polinomios______________________________________

Para conocer el resto de la divisin de polinomios basta con poner >>[p4,r] = deconv(p3,p2)

El comando residue, permite el clculo del desarrollo en suma de fracciones simples del cociente p1/p2. p2 debe tener races reales El formato del comando es: >>[r,p,k] =residue(p1,p2) donde: r= vector columna con los numeradores p= vector columna con las raices del denominador k= vector fila con los coeficientes del polinomio independiente.

p1( x ) r (1) r (n ) k(x) p2( x ) x p(1) x p(n )

Polinomios______________________________________

>>[p1,p2]=residue(r,p,k) hace la operacin inversa Ejemplo6: Descomponer en fracciones simples el cociente

p1=[1 1 0 1] p2=[1 3 0 4] [r,p,k]=residue(p1,p2) rats(r)

x3 x2 1 x 3 3x 2 4

x3 x2 1 35 13 1 1 3 2 2 x 3 x 4 9( x 2) 3( x 2) 9( x 1)
[pol1,pol2]=residue(r,p,k)

Polinomios______________________________________

Para calcular la derivada de un polinomio tenemos el comando, >>polyder(p) Ejemplo7: Dado el polinomio x3+6x2+1 su derivada es

p=[1, 6,0,1]; d=polyder(p) % es decir 3x2+12x

Curso Matlab 2002-03 enxamb. Nieves Lorenzo

PROGRAMACIN

PROGRAMACIN________________________________

Comandos de entrada salida input: nos permite introducir datos variable=input(mensaje a pantalla); disp: muestra un texto por pantalla disp(El algoritmo no ha convergido)

PROGRAMACIN________________________________

Testear el nmero de argumentos nargin devuelve el nmero de argumentos de entrada con los que el usuario ha llamado a la funcin. nargout devuelve el nmero de argumentos de salida con los que el usuario ha llamado a la funcin. nargchk chequea si el nmero de argumentos de entrada calculados con nargin esta entre el valor mximo y mnimo previsto, si no da error. nargchk(mnimo,mximo,nmero_entrada)

PROGRAMACIN________________________________

Bucles. Bucles anidados for k=n1:incre:n2 end Con break se rompe la ejecucin Estructuras de control condicionadas
switch expresion case expresion_0

if

comandos_0 que deben ejecutarse


case expresion_1

elseif
else end
end

comandos_1 que deben ejecutarse


case expresion_2

while end

comandos_2 que deben ejecutarse


otherwise

comandos escoba que deben ejecutarse

PROGRAMACIN________________________________

Programacin de funciones function arg_salida=nombre_funcion(arg_entrada) El fichero se debe guardar con nombre_funcion.m Para devolver el control al programa desde cualquier punto de una funcin basta con escribir la sentencia return Ejercicio Utilizando estructuras de control construir una funcin que nos calcule las races de una ecuacin de segundo grado ax2+bx+c=0

function raiz=sole2(a,b,c) %raiz=sole2(a,b,c) %solucion de la ecuacion de segundo grado %ax^2+bx+c=0, a~=0 % if (nargin ~=3) error(El numero de argumentos de entrada debe ser 3) end discri=b^2-4*a*c; raiz=[]; if(discri==0) raiz=-b/(2*a); disp([Raiz doble=,num2str(raiz)]) return elseif(discri>0) raiz(1)=(-b+sqrt(discri))/(2*a); raiz(2)=(-b-sqrt(discri))/(2*a); disp([Raices reales simples=,num2str(raiz)]) return else raiz(1)=(-b+sqrt(-discri)*i)/(2*a); raiz(2)=(-b-sqrt(-discri)*i)/(2*a); disp([Raices complejas=,num2str(raiz)]) return end Ejemplos para utilizar esta funcin: raiz=sole2(2,3,1); raiz=sole2(1,0,1);

Ejemplo de repaso:
function h= pitag (a,b) h=sqrt (a^2+b^2);

%Utilizacin de una funcion (pitag.m) a=input('Ingrese cateto x='); b=input('Ingrese cateto y='); disp ('La hipotenusa es'),disp (pitag(a,b))

Tema Tema.
Graficacin con MatLab

Sumario
3.1. Grficacin en 2D 3.1.1. Funcin plot

3.1.2. Estilos de lnea y marcadores en la funcin plot


3.1.3. Aadir curvas a un grfico ya existente

3.1.4. Comando subplot


3.1.5. Funcin fplot 3.1.6. Otros tipos de grficas 2D

Sumario
3.2. Graficacin en 3D 3.2.1. Dibujo de lneas: funcin plot3

3.2.2. Mallados: Funciones meshgrid, mesh y surf 3.2.3. Lneas de contorno: funciones contour y contour3

Grficacin en 2D
MatLab proporciona una variedad importante de funciones para representar grficamente datos vectoriales tanto en 2D como en 3D.
Adicionalmente pone a disposicin de usuario otro grupo de funciones para la manipulacin e impresin de los grficos creados.

Grficacin en 2D
Funciones ms empleadas en la representacin de datos
plot
loglog

semilogx
semilogy

Crea grfico con escala lineal en ambos ejes Crea grfico con escala logaritmica en ambos ejes Crea grfico con escala logaritmica en el eje X y lineal en el eje Y Crea grfico con escala logaritmica en el eje Y y lineal en el eje X

Grficacin en 2D
Ejemplo 1:

Grficacin en 2D
Ejemplo 2:

Grficacin en 2D
Cmo aadir informacin al grfico?
title(ttulo) Agrega unttulo al dibujo xlabel(...) Agrega un ttulo al eje X. xlabel off lo elimina

ylabel(...) legend() grid

Agrega un ttulo al eje Y. ylabel off lo elimina Define rtulos para las lneas Activa la cuadrcula en el dibujo

Grficacin en 2D
Ejemplo:

Estilos de lnea y marcadores

Estilos de lnea y marcadores


Ejemplo:

Aadiendo curvas a un grfico


Para aadir nuevas lneas (curvas) a un grfico ya existente se emplean los comandos: hold on y hold off.
El comando hold on permite que se mantengan los grficos existentes a pesar de que pueda ocurrir un reescalamiento. La instruccin hold off elimina esta posibilidad.

Aadiendo curvas a un grfico


Ejemplo:

Comando subplot
Las ventanas grficas se pueden subdividir en m filas y n columnas siendo cada celda un grfico diferente. Sintaxis:
subplot(m, n, i);

donde i es el grfico activo.

Ejemplo de repaso:
clear all; close all; %Grficar en dos dimensiones x=linspace(0,2*pi,30); Y1=sin(x); Y2=cos(x); Y3=2*sin(x).*cos(x); Y4=sin(x)./(cos(x)+eps); %eps=2^-52 y se coloca para evitar la div 0 %Activamos el rea 1 para colocar %el grfico Y1 subplot(2,2,1) plot(x,Y1),axis([0 2*pi -1 1]) title('Y1=sen(x)')

%Activamos el rea 2 para colocar %el grfico Y2 subplot(2,2,2) plot(x,Y2),axis([0 2*pi -1 1]) title('Y2=cos(x)')
%Activamos el rea 3 para colocar %el grfico Y3 subplot(2,2,3) plot(x,Y3),axis([0 6 -1 1]) title('Y3=2sen(x)cos(x)') %Activamos el rea 4 para colocar %el grfico Y4 subplot(2,2,4) plot(x,Y4,':g'), axis([0 6 -20 20]) title('Y4=sen(x)/cos(x)')

Otros tipos de grficas 2D


MatLab dispone de varios tipos de grficos distintos a los que genera la funcin plot, algunas de ellas son:
bar() Grfico de barras verticales (barh() horiz)

bar3() pie() pie3 stairs() hist()

Grfico de barras verticales 3D (bar3h() horiz) Grfico de pastel Grfico de pastel 3D Grfico de barras sin lneas internas Representa el histograma de un vector

Otros tipos de grficas 2D


Ejemplo:

Funcin fplot
A diferencia de la funcin plot donde haba que especificar un vector de valores [x,y] a la funcin fplot solo hay que especificarle el nombre de una funcin o fichero donde encontrarla sin preocuparnos por detalles como el de la pendiente por citar tan solo un ejemplo.

Funcin fplot
Sintaxis:
fplot(funcin, lmites, markers, tol);
funcin lmites markers tol Nombre de la funcin o fichero *.m

Vector de elementos [xmin,xmax] o [xmin,xmax,ymin,ymax] Cadena para controlar el color, estilo etc (igual que en la funcin plot) Tolerancia del error relativo. Default (2e-03)

Graficacin en 3D
MatLab posee excelentes cualidades para la graficacin en 3D de curvas y superficies y tal vez sea esta una de las cosas ms interesantes a los ojos de cualquier profesor o estudiante de las carreras de ingeniera.

La funcin plot3
La funcin plot3 es la homloga de la funcin plot para la graficacin en 2D.

Sintaxis:
plot3(x, y, z, Especif. del grfico);

La funcin plot3
Ejemplo:

Representacin de funciones en 3D
En 2D:

EN 3D:

Representacin de funciones en 3D
Ejemplo: graficar la funcin Z=X/Y. x=1:1:5; y=1:1:10; %NOS CONSTRUYE LA MALLA DE NUDOS [X,Y]=meshgrid(x,y); % LA FUNCIN Z=X./Y; % GRAFICA Z= F (X,Y) y % ubica las ternas en (x,y,z) mesh(X,Y,Z)

Funcin meshgrid
La funcin meshgrid se emplea para

generar dos matrices de coordenadas que son empleadas en la representacin tridimensional.


Sintaxis:
[x,y]= meshgrid(xini:xfin, yini:yfin);

Funcin mesh
La funcin mesh construye un

mallado paramtrico tridimensional a partir de las matrices x, y, z.


Sintaxis:
mesh(x, y, z);

Funcin mesh
Ejemplo:

Funcin mesh
Observacin: La coloracin del grfico generado por la funcin mesh es tomado por defecto como funcin de los valores de z. Los valores del color pueden ser asignados por el usuarios tambin a travs de un vector de colores.

Funcin surf
La funcin surf genera un grfico

tridimensional rellenado a partir de las matrices x, y, z de manera similar a la funcin mesh.


Sintaxis:
surf(x, y, z);

Funcin surf
Ejemplo:

Funciones contour y contour3


Las funciones contour y contour3 generan un grfico tridimensional a travs de un conjunto de lneas de nivel de la funcin argumento. Sintaxis:
contour(func, num_cur_niv); contour3(func, num_cur_niv);

Funcin contour
Ejemplo:

Funcin contour3
Ejemplo:

Ejemplo de repaso:
close all; clear all; %Grficas de malla y superficie x=-7.5:0.5:7.5; y=x; [X,Y]=meshgrid(x,y); R=sqrt(X.^2+Y.^2)+eps; Z=sin(R)./R;

subplot (2,2,4)
surfc(X,Y,Z) view (40,80) lightangle(55, 55) figure a=-2:0.2:2; b=-2:0.2:2; [A B]=meshgrid(a,b) C=A.*exp(-A.^2-B.^2) subplot (3,1,1); contour3(A,B,C) subplot(3,1,3); contour(A,B,C)

subplot (2,2,1) mesh(X,Y,Z)


subplot (2,2,2) surf(X,Y,Z) subplot (2,2,3) meshc(X,Y,Z) surfc(X,Y,Z) % view (40,45) % lightangle(35, 35)

RESUMEN DE TIPOS DE GRFICOS

2D

Tema Tema.
Generacin de informacin

Tema Tema.
Otros tipos de datos en MatLab

Sumario
4.1. Cadenas de caracteres 4.2. Hipermatrices (arreglos de ms de 2 dim.)

4.3. Estructuras
4.4. Cell arrays (matrices de celdas)

Cadenas de caracteres
MatLab tambin opera con cadenas de caracteres, muy similar a como se hace con lenguajes tan conocidos como C++.
Los caracteres de una cadena se almacenan en un vector de manera que existir un carcter por elemento.

Cadenas de caracteres
Una cadena carcter se representa entre comillas simples (cadena).
Ejemplos:

Cadenas de caracteres
Para representar un carcter en MatLab se emplean 2 bytes o sea 16 bits.

Algunas operaciones con cadenas

Algunas operaciones con cadenas


char(v) char(c1,..,cn) Convierte un vector de numeros en una cadena Crea una matriz de caracteres (completando con espacios las cadenas ms cortas)

Elimina espacios al final de la cadena Detecta si un caracter es un espacio o no Imprime la cadena c Compara las cadenas c1 y c2 Compara los n primeros caracteres de las strcomp(c1,c2,n) cadenas c1 y c2 Sustituye c2 por c3 cada vez que aparezca c2 en strrep(c1,c2,c3) c1

deblank(c) isspace() disp(c) strcomp(c1,c2)

TIEMPOS DE CALCULO

Tiempo y esfuerzo de clculo


En MatLab est abierta la posibilidad de obtener los tiempos de clculo de una forma muy sencilla para el usuario, siendo esto en muchas ocasiones de suma importancia. Para este fin se emplean las funciones: cputime; etime y tic ops toc

Tiempo y esfuerzo de clculo


% help clock % CLOCK Current date and time as date vector.

% CLOCK returns a six element date vector vector containing the % current time and date in decimal form: % CLOCK = [year month day hour minute seconds]

% The first five elements are integers. The seconds element % is accurate to several digits beyond the decimal point.

Tiempo y esfuerzo de clculo


% help etime

% ETIME

Elapsed time.

% ETIME(T1,T0) returns the time in seconds that has elapsed % between vectors T1 and T0. The two vectors must be six

% elements long, in the format returned by CLOCK:

% T = [Year Month Day Hour Minute Second]

Tiempo de clculo (ejemplo)


Se desea resolver un sistema lineal arbitrario con 1000 Ecs. de la forma: Ax=b x=A-1b = A\b
>> n=1000; >> A=rand(n);

>> b=rand(n,1);
>> x=zeros(n,1);
Tiempo transcurrido ??

Tiempo y esfuerzo de clculo


% EJEMPLO (SIN ECO EN LOS CLOCK): n=1000; A=rand(n); b=rand(n,1); x=zeros(n,1); % EJEMPLO (CON ECO EN LOS CLOCK): ... %Tiempo de inicio: tiempoIni=clock % SIN PUNTO Y COMA

%operacin: x=A\b; %Tiempo de fin: tiempoFin=clock % SIN PUNTO Y COMA

%Tiempo de inicio: tiempoIni=clock; %operacin: x=A\b; %Tiempo de fin: tiempoFin=clock;

tiempo=etime(tiempoFin, tiempoIni) RESULTADO: tiempoIni = 1.0e+003 * 2.0060 0.0090 0.0290 0.0090 0.0270 0.0436

tiempo=etime(tiempoFin, tiempoIni)

tiempoFin = 1.0e+003 * 2.0060 0.0090 0.0290 0.0090 0.0270 0.0506

RESULTADO:

tiempo =

5.2810

tiempo =

Tiempo y esfuerzo de clculo


OTRAS FUNCIONES SIMILARES:
n=1000; A=rand(n); b=rand(n,1); x=zeros(n,1); tiempoIni=clock; x=A\b; tiempo=etime(clock, tiempoIni) time=cputime; x=A\b; time=cputimetime tic; x=A\b; toc

RESULTADOS: tiempo = 5.3130 time = 5.2350 elapsed_time = 5.2030

Fin del primer da

CREACIN DE
INTERFACES GRFICAS

What Is GUIDE?
provides a set of tools for creating graphical user interfaces (GUIs). These tools greatly simplify the process of designing and building GUIs. You can use the GUIDE tools to :
- Lay out the GUI - Program the GUI

DEMO :
Create an easy GUI :

GUIDE Templates

Guide --> ActiveX

ActiveX Control

Property Inspector Create

Example
>> GUI_activeX

DEMO :
Integrate With Data Acquisition In GUI

Você também pode gostar