function matricesAsocLin_GUI %% Interfaz Gráfica para el Práctico 5 - Memorias Asociativas Lineales % Permite manipular vectores que representan rostros, en una Matriz % Autoasociativa % % Sección Biofísica - Álvaro Cabana - 2010 %% Inicialización de componentes y variables f = figure('Visible','off','Name','Memorias Asociativas Lineales',... 'Position',[80,80,900,650]); set(f,'Visible','off'); % Figura invisible datos=load('fotos3.mat'); % Carga datos... select=1; entrada=nan; norma=nan; %Panel de opciones optPanel=uipanel('Parent',f,'Title','Opciones de Entrada','Position',[.01 .01 .5 .95]); %Panel de ruido ruidoPanel=uipanel('Parent',optPanel,'Title','Nivel de ruido','Position',[.6 .8 .25 .17]); %Panel de recorte recortePanel=uipanel('Parent',optPanel,'Title', 'Recorte', 'Position', [.04 .7 .30 .12]); %Panel de salida salidaPanel=uipanel('Parent',f,'Title','Salida','Position',[.51 .01 .49 .95]); %Panel de destrucción destPanel=uipanel('Parent',salidaPanel,'Title','Nivel de destrucción de pesos sinápticos','Position',[.1 .8 .8 .17]); % Lista de actores listaPersonas=uicontrol(optPanel,'Style','popupmenu','String',{'Johnny Depp','Brad Pitt','Clint Eastwood','Tom Cruise'},... 'Value',1,'Position',[20 520 130 20],'Callback',{@listaPersonas_Callback}); stringLista=uicontrol(optPanel,'Style','text','String','Elija un rostro','Position',[20 540 100 20]); %Check de ojos ojosCheck=uicontrol(recortePanel,'Style','checkbox','String','Ojos','Value',0,'Position',[20 40 100 20]);%,... %'Callback',{@ojosCheck_Callback}); %Check de rostro rostroCheck=uicontrol(recortePanel,'Style','checkbox','String','Medio rostro','Value',0,'Position',[20 10 100 20]);%,... %'Callback',{@rostroCheck_Callback}); % Slider de ruido nivelRuido=uicontrol(ruidoPanel,'Style','slider','Min',0,'Max',100,'Value',0,'SliderStep',[.01 .2],... 'Position',[10 30 100 20],'Callback',{@nivelRuido_Callback}); % Editor de ruido editRuido=uicontrol(ruidoPanel,'Style','edit','String','0','Position',[30 60 40 20],... 'Callback',{@editRuido_Callback}); % Botón de visualizar entrada entBut=uicontrol(optPanel,'Style','pushbutton','String','Visualizar','Position',[85 390 80 20],... 'Callback',{@entBut_Callback}); % Botón de calcular salida salBut=uicontrol(optPanel,'Style','pushbutton','String','Calcular Salida','Position',[630 390 90 20],... 'Callback',{@salBut_Callback}); % Axes entrada entAxes=axes('Parent',optPanel,'Position',[.15 .2 .43 .4]); % Axes salida salAxes=axes('Parent',salidaPanel,'Position',[.15 .2 .43 .4]); % Slider de destrucción nivelDest=uicontrol(destPanel,'Style','slider','Min',0,'Max',100,'Value',0,'SliderStep',[.01 .2],... 'Position',[10 30 100 20],'Callback',{@nivelDest_Callback}); % Editor de destrucción editDest=uicontrol(destPanel,'Style','edit','String','0','Position',[30 60 40 20],... 'Callback',{@editDest_Callback}); set(f,'Visible','on'); %% Programación de Callbacks function listaPersonas_Callback(hObject,eventdata) select=get(hObject,'Value'); end %Callback de Edit Ruido function editRuido_Callback(hObject,eventdata) valor = str2double(get(hObject,'string')); if isnan(valor) errordlg('Se debe entrar un número entre 0 y 100!','Error de entrada','modal') set(hObject,'String','0'); return else if valor<0 errordlg('El número debe estar entre 0 y 100!','Error de entrada','modal') set(hObject,'String','0'); return else if valor>100 errordlg('El número debe ser mayor o igual a cero!','Error de entrada','modal') else set(nivelRuido,'Value',valor); end end end end function nivelRuido_Callback(hObject,eventdata) set(editRuido,'String',num2str(round(get(hObject,'Value')))); end %Callback de Edit Destrucción function editDest_Callback(hObject,eventdata) valor = str2double(get(hObject,'string')); if isnan(valor) errordlg('Se debe entrar un número entre 0 y 100!','Error de entrada','modal') set(hObject,'String','0'); return else if valor<0 errordlg('El número debe estar entre 0 y 100!','Error de entrada','modal') set(hObject,'String','0'); return else if valor>100 errordlg('El número debe ser mayor o igual a cero!','Error de entrada','modal') else set(nivelDest,'Value',valor); end end end end %Callback de Nivel Dest function nivelDest_Callback(hObject,eventdata) set(editDest,'String',num2str(round(get(hObject,'Value')))); end %Callback de Ver Entrada function entBut_Callback(hObject,eventdata) % Ruido ruido = get(nivelRuido,'Value')/100; matrizRuido = datos.lists{select}; %ms=size(matrizRuido); if ruido>0 pixelesRuido = rand(datos.ms)0 sorteo=rand(s)<(perdest/100); Mp=datos.Ms; Mp(sorteo)=0; salidaVec=Mp*(sentrada./norm(sentrada)); % Con Laplaciano y normalizada clear sorteo Mp; else salidaVec=datos.Ms*(sentrada./norm(sentrada)); % Con Laplaciano y normalizada end %salidaVec=datos.Ms*(sentrada./norm(sentrada)); % Con Laplaciano y normalizada %salidaVec=datos.Ms*(sentrada); % Con laplaciano ! salidaVec=(datos.Linv*salidaVec).*norma; %Deshacer laplaciano ! Quitar la normalización salidaVec=salidaVec-min(salidaVec); %Llevar a 0 el mínimo %Destrucción %if perdest>0 % lambda=7/6*s*perdest/100; % nshots=poissrnd(lambda,s,1); %Cuántos golpes componente? % for i=1:s % if nshots(i)>0 % if nshots(i)>s % nshots(i)=s; % end % salidaVec(i)=salidaVec(i)-salidaVec(i)*nshots(i)/s; % end % end % end salida=toMatrix(salidaVec,datos.ms(2));%.*norma); % Ya se normalizó antes %Visualizar salida colormap('gray') set(f,'CurrentAxes',salAxes); imagesc(salida) end end end