% APRENDIZAJE AUTOMÁTICO: UN ENFOQUE PRÁCTICO
% Autores: María Guijarro, P. Javier Herrera y Gonzalo Pajares
% Copyright RA-MA, 2010
% Capítulo 3: COMBINACIÓN DE CLASIFICADORES

function varargout = EjemploAplicacionCapitulo03(varargin)
% EJEMPLOAPLICACIONCAPITULO03 M-file for EjemploAplicacionCapitulo03.fig
%      EJEMPLOAPLICACIONCAPITULO03, by itself, creates a new EJEMPLOAPLICACIONCAPITULO03 or raises the existing
%      singleton*.
%
%      H = EJEMPLOAPLICACIONCAPITULO03 returns the handle to a new EJEMPLOAPLICACIONCAPITULO03 or the handle to
%      the existing singleton*.
%
%      EJEMPLOAPLICACIONCAPITULO03('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in EJEMPLOAPLICACIONCAPITULO03.M with the given input arguments.
%
%      EJEMPLOAPLICACIONCAPITULO03('Property','Value',...) creates a new EJEMPLOAPLICACIONCAPITULO03 or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before EjemploAplicacionCapitulo03_OpeningFunction gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to EjemploAplicacionCapitulo03_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools archivo.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help EjemploAplicacionCapitulo03

% Last Modified by GUIDE v2.5 09-Mar-2010 14:10:02

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @EjemploAplicacionCapitulo03_OpeningFcn, ...
                   'gui_OutputFcn',  @EjemploAplicacionCapitulo03_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before EjemploAplicacionCapitulo03 is made visible.
function EjemploAplicacionCapitulo03_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to EjemploAplicacionCapitulo03 (see VARARGIN)

% Choose default command line output for EjemploAplicacionCapitulo03
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes EjemploAplicacionCapitulo03 wait for user response (see UIRESUME)
% uiwait(handles.figure1);
visible = 'on';
novisible = 'off';  

set(handles.text17,'visible',novisible); % ¿Nuevos datos?: texto fijo
set(handles.edit17,'visible',novisible); % ¿Nuevos datos?: texto editable
% set(handles.edit17,'Enable','off'); % ¿Nuevos datos?: No se puede escribir
set(handles.text18,'visible',novisible); % ¿Seleccionar muestras con el ratón?: texto fijo
set(handles.edit18,'visible',novisible); % ¿Seleccionar muestras con el ratón?: texto editable
set(handles.text19,'visible',novisible); % ¿Más imagenes de entrenamiento?: texto fijo
set(handles.edit19,'visible',novisible); % ¿Más imagenes de entrenamiento?: texto editable

set(handles.text3,'visible',novisible); % Paso de muestreo: texto fijo
set(handles.edit2,'visible',novisible); % Paso de muestreo: texto editable
%set(handles.checkbox4,'visible','on'); % Elección de algoritmo: Pseudoaleatorio/Cuantizacion vectorial
set(handles.uipanel3,'visible',novisible); % panel de algoritmos

set(handles.pushbutton3,'visible',novisible); % ¿ Intentar nueva particion?
set(handles.text14,'visible',novisible); % Factor de submuestreo: texto fijo
set(handles.edit14,'visible',novisible); % Factor de submuestreo: texto editable
set(handles.text15,'visible',novisible); % Parametro h de la ventana de Parzen: texto fijo
set(handles.edit15,'visible',novisible); % Parametro h de la ventana de Parzen: texto editable
set(handles.text22,'visible',novisible); % Parámetro g de la Integral Fuzzy: texto fijo
set(handles.edit22,'visible',novisible); % Parámetro g de la Integral Fuzzy: texto editable 1
set(handles.edit23,'visible',novisible); % Parámetro g de la Integral Fuzzy: texto editable 2
set(handles.edit24,'visible',novisible); % Parámetro g de la Integral Fuzzy: texto editable 3
set(handles.pushbutton5,'visible',novisible); % botón ok integral fuzzy
set(handles.text21,'visible',novisible); % ¿Más imágenes de clasificación?: texto fijo
set(handles.edit21,'visible',novisible); % ¿Más imágenes de clasificación?: texto editable

set(handles.axes2,'visible','off'); % Cuadro de imagen
set(handles.popupmenu2,'visible','off'); % menu de representación aprendizaje
% set(handles.text20,'FontWeight','bold'); % Mostrar siempre en negrita el texto del cuadro de información
set(handles.text20,'String','Se pregunta si se van a tomar nuevas muestras de aprendizaje o por el contrario, sirven las ya existentes de otros procesos anteriores');
set(handles.pushbutton4,'visible',novisible); % Botón clasificar tras finalizar el entrenamiento
set(handles.popupmenu3,'visible','off'); % menu de representacion clasificación

global num_img; % número de imagenes que tenemos
num_img = 0;

global num_clases peso_exp1 crit_term1 max_iter1; % Parámetros de alg. pseudoaleatorio
% Inicializamos parámetros con valores por defecto:
num_clases = 3;
peso_exp1 = 2;
crit_term1 = 1e-2;
max_iter1 = 20;

global umb_dif_clases peso_exp2 crit_term2 max_iter2; % Parámetros de alg. cuantización vect.
% Inicializamos parámetros con valores por defecto:
umb_dif_clases = 80;
peso_exp2 = 2;
crit_term2 = 1e-2;
max_iter2 = 20;

global g1 g2 g3; % Parámetros del vector g de la Integral Fuzzy
% Inicializamos parámetros con valores por defecto:
g1 = 0.2;
g2 = 0.5;
g3 = 0.8;

% --- Outputs from this function are returned to the command line.
function varargout = EjemploAplicacionCapitulo03_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;

% Seleccionamos como vísible aquella información que queremos que esté
% disponible nada más arrancar la aplicación:





% MENU
% --------------------------------------------------------------------
function archivo_Callback(hObject, eventdata, handles)
% hObject    handle to archivo (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% --------------------------------------------------------------------
function reiniciar_Callback(hObject, eventdata, handles)
% hObject    handle to reiniciar (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
clear global ClasesYagerUnion ClasesYagerIntersec ClasesYagerUnInt ClasesYagerIntUn ClasesMaxRule ClasesMinRule ClasesMedianRule ClasesIntegralFuzzy ClasesMajorityVote

novisible = 'off';
cla(handles.axes2); % borra las curvas existentes en la ventana de gráficas y redibuja los ejes coordenados.

set(handles.text17,'visible',novisible); % ¿Nuevos datos?: texto fijo
set(handles.edit17,'visible',novisible); % ¿Nuevos datos?: texto editable
% set(handles.text17,'FontWeight','bold'); % mostramos en negrita
set(handles.text18,'visible',novisible); % ¿Seleccionar muestras con el ratón?: texto fijo
set(handles.edit18,'visible',novisible); % ¿Seleccionar muestras con el ratón?: texto editable
set(handles.text19,'visible',novisible); % ¿Más imagenes de entrenamiento?: texto fijo
set(handles.edit19,'visible',novisible); % ¿Más imagenes de entrenamiento?: texto editable
set(handles.text3,'visible',novisible); % Paso de muestreo: texto fijo
set(handles.edit2,'visible',novisible); % Paso de muestreo: texto editable
set(handles.uipanel3,'visible',novisible); % panel de algoritmos
set(handles.pushbutton3,'visible',novisible); % ¿ Intentar nueva particion?
set(handles.text14,'visible',novisible); % Factor de submuestreo: texto fijo
set(handles.edit14,'visible',novisible); % Factor de submuestreo: texto editable
% set(handles.text14,'FontWeight','bold'); % mostramos en negrita
set(handles.text15,'visible',novisible); % Parametro h de la ventana de Parzen: texto fijo
set(handles.edit15,'visible',novisible); % Parametro h de la ventana de Parzen: texto editable
set(handles.text22,'visible',novisible); % Parámetro g de la Integral Fuzzy: texto fijo
set(handles.edit22,'visible',novisible); % Parámetro g de la Integral Fuzzy: texto editable 1
set(handles.edit23,'visible',novisible); % Parámetro g de la Integral Fuzzy: texto editable 2
set(handles.edit24,'visible',novisible); % Parámetro g de la Integral Fuzzy: texto editable 3
set(handles.pushbutton5,'visible',novisible); % botón ok integral fuzzy
set(handles.text21,'visible',novisible); % ¿Más imágenes de clasificación?: texto fijo
set(handles.edit21,'visible',novisible); % ¿Más imágenes de clasificación?: texto editable

set(handles.axes2,'visible','off'); % Cuadro de imagen
set(handles.popupmenu2,'visible','off'); % menu de representación aprendizaje
% set(handles.text20,'FontWeight','bold'); % Mostrar siempre en negrita el texto del cuadro de información
set(handles.text20,'String','Se pregunta si se van a tomar nuevas muestras de aprendizaje o por el contrario, sirven las ya existentes de otros procesos anteriores');
set(handles.pushbutton4,'visible',novisible); % Botón clasificar tras finalizar el entrenamiento
set(handles.popupmenu3,'visible','off'); % menu de representacion clasificación

global num_img; % número de imagenes que tenemos
num_img = 0;

global num_clases peso_exp1 crit_term1 max_iter1; % Parámetros de alg. pseudoaleatorio
% Inicializamos parámetros con valores por defecto:
num_clases = 3;
peso_exp1 = 2;
crit_term1 = 1e-2;
max_iter1 = 20;

global umb_dif_clases peso_exp2 crit_term2 max_iter2; % Parámetros de alg. cuantización vect.
% Inicializamos parámetros con valores por defecto:
umb_dif_clases = 80;
peso_exp2 = 2;
crit_term2 = 1e-2;
max_iter2 = 20;

global g1 g2 g3; % Parámetros del vector g de la Integral Fuzzy
% Inicializamos parámetros con valores por defecto:
g1 = 0.2;
g2 = 0.5;
g3 = 0.8;

% Inicializamos textos editables:
set(handles.edit17,'String',''); % ¿Nuevos datos?: texto editable
set(handles.edit18,'String',''); % ¿Seleccionar muestras con el ratón?: texto editable
set(handles.edit19,'String',''); % ¿Más imagenes de entrenamiento?: texto editable
set(handles.edit2,'String','4'); % Paso de muestreo: texto editable
set(handles.edit5,'String','3'); % Numero de clases: texto editable
set(handles.edit6,'String','2'); % Peso exponencial: texto editable
set(handles.edit7,'String','1e-2'); % Criterio de terminacion: texto editable
set(handles.edit8,'String','20'); % Número máximo de iteraciones: texto editable
set(handles.edit9,'String','80'); % Umbral diferenciacion de clases: texto editable
set(handles.edit10,'String','2'); % Peso exponencial: texto editable
set(handles.edit11,'String','1e-2'); % Criterio de terminacion: texto editable
set(handles.edit12,'String','20'); % Numero maximo de iteraciones: texto editable
set(handles.edit14,'String','2'); % Factor de submuestreo: texto editable
set(handles.edit15,'String','4'); % Parametro h de la ventana de Parzen: texto editable
set(handles.edit22,'String','0.8'); % Parámetro g de la Integral Fuzzy: texto editable 1
set(handles.edit23,'String','0.2'); % Parámetro g de la Integral Fuzzy: texto editable 2
set(handles.edit24,'String','0.5'); % Parámetro g de la Integral Fuzzy: texto editable 3
set(handles.edit21,'String',''); % ¿Más imágenes de clasificación?: texto editable

% Permitimos que se editen/pulsen nuevamente:
set(handles.edit17,'Enable','on'); % ¿Nuevos datos?: texto editable
set(handles.edit18,'Enable','on'); % ¿Seleccionar muestras con el ratón?: texto editable
set(handles.edit19,'Enable','on'); % ¿Más imagenes de entrenamiento?: texto editable
set(handles.edit2,'Enable','on'); % Paso de muestreo: texto editable
set(handles.edit5,'Enable','on'); % Numero de clases: texto editable
set(handles.edit6,'Enable','on'); % Peso exponencial: texto editable
set(handles.edit7,'Enable','on'); % Criterio de terminacion: texto editable
set(handles.edit8,'Enable','on'); % Número máximo de iteraciones: texto editable
set(handles.edit9,'Enable','on'); % Umbral diferenciacion de clases: texto editable
set(handles.edit10,'Enable','on'); % Peso exponencial: texto editable
set(handles.edit11,'Enable','on'); % Criterio de terminacion: texto editable
set(handles.edit12,'Enable','on'); % Numero maximo de iteraciones: texto editable
set(handles.edit14,'Enable','on'); % Factor de submuestreo: texto editable
set(handles.edit15,'Enable','on'); % Parametro h de la ventana de Parzen: texto editable
set(handles.edit22,'Enable','on'); % Parámetro g de la Integral Fuzzy: texto editable 1
set(handles.edit23,'Enable','on'); % Parámetro g de la Integral Fuzzy: texto editable 2
set(handles.edit24,'Enable','on'); % Parámetro g de la Integral Fuzzy: texto editable 3
set(handles.edit21,'Enable','on'); % ¿Más imágenes de clasificación?: texto editable
set(handles.radiobutton6,'value',0); % Aparece sin marcar el rediobutton 'aprender'
set(handles.radiobutton7,'value',0); % Aparece sin marcar el rediobutton 'clasificar'
set(handles.radiobutton6,'Enable','on'); % Se puede seleccionar el botón APRENDIZAJE
set(handles.radiobutton7,'Enable','on'); % Se puede seleccionar el botón CLASIFICACIÓN
set(handles.radiobutton2,'value',0); % Aparece sin marcar el rediobutton 'pseudoaleatorio'
set(handles.radiobutton3,'value',0); % Aparece sin marcar el rediobutton 'cuantizacion vectorial'
set(handles.radiobutton2,'Enable','on'); % Se puede seleccionar el botón PSEUDOALEATORIO
set(handles.radiobutton3,'Enable','on'); % Se puede seleccionar el botón CUANTIZACION VECT.
set(handles.pushbutton1,'Enable','on'); % botón aceptar alg. pseudo.
set(handles.pushbutton2,'Enable','on'); % botón aceptar alg. cuant. vect.
set(handles.pushbutton3,'Enable','on'); % botón nueva partición
set(handles.pushbutton4,'Enable','on'); % botón clasificar tras entrenamiento
set(handles.pushbutton5,'Enable','on'); % botón ok integral fuzzy

% --------------------------------------------------------------------
function salir_Callback(hObject, eventdata, handles)
% hObject    handle to salir (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
clear all;
delete(gcf);



% --- Executes on mouse press over figure background.
function figure1_ButtonDownFcn(hObject, eventdata, handles)
% hObject    handle to figure1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% set(handles.uipanel3,'visible','off');


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% APRENDIZAJE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% --> Nuevos Datos
function edit17_Callback(hObject, eventdata, handles)
% hObject    handle to edit17 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit17 as text
%        str2double(get(hObject,'String')) returns contents of edit17 as a double
global X X1; % var global
global num_img; % var global
global I;
global d1;
global MI MA;

c = get(hObject,'String');
res = strcmpi(c,'s');
res2 = strcmpi(c,'n');
res3 = strcmpi(c,'a');

if (res ~= 1) && (res2 ~= 1) && (res3 ~= 1)
    set(handles.text20,'String','Caracter introducido no valido. Escriba S (si), N (no) o A(añadir nuevas muestras a las ya existentes)'); % Cuadro de información

elseif (res == 1) || (exist('MuestrasAprendizaje.mat') == 0)% Se seleccionan nuevos datos o no existen muestras de aprendizaje previas:
    set(handles.text20,'String',''); % Cuadro de información    

    %num_img = 0;
    
    % Mostramos siguiente campo:
    set(handles.text18,'visible','on'); % ¿Seleccionar muestras con el ratón?: texto fijo
%     set(handles.text18,'FontWeight','bold'); % Mostrar en negrita
    set(handles.edit18,'visible','on'); % ¿Seleccionar muestras con el ratón?: texto editable 
    set(handles.edit18,'Enable','on'); % Permitimos que se edite este campo
    set(handles.text20,'String','Se pueden seleccionar las muestras con el ratón o ser el propio programa el que realice la selección.');
    % No permitimos que se edite este campo nuevamente:
    set(handles.edit17,'Enable','off');
%     set(handles.text17,'FontWeight','normal'); % no mostramos en negrita
    
    % numero de imágenes
    num_img = num_img + 1;
    
    if (num_img < 10)
        IO = imread(strcat('IEntrenamiento_0',num2str(num_img),'.bmp'));
    else
        IO = imread(strcat('IEntrenamiento_',num2str(num_img),'.bmp'));
    end
    
    %leer los datos de la imagen original
    step = 1;
    [M,N,s] = size(IO);
    I = IO(1:step:M,1:step:N,:);
    % Mostramos imagen:
    imshow(I);
    
    X = [0 0 0];
    if (exist('MuestrasAprendizaje.mat') == 0) && (res == 0)
        set(handles.text20,'String','No existen muestras de procesos anteriores. Es necesario introducir nuevas muestras de aprendizaje');
    end
    [d1,d2] = size(X);
    
    set(handles.radiobutton6,'Enable','inactive'); % Ya no se puede seleccionar el botón APRENDIZAJE
    set(handles.radiobutton7,'Enable','inactive'); % Ya no se puede seleccionar el botón CLASIFICACIÓN
end

if (res2 == 1) % Se ha seleccionado NO 
    %cargar los datos existentes en la Base de Conocimiento
    if exist('MuestrasAprendizaje.mat') ~= 0 
      load MuestrasAprendizaje
      set(handles.text20,'String','Se han cargado muestras existentes de procesos anteriores');
      [d1,d2] = size(X);
      
      % en X1 se mantienen los datos originales sin normalizar
      X1 = X;
      % %normalizacion de datos en el rango [0,1]
      MI=min(X); %minimo
      MA=max(X); %maximo
      X=(X-repmat(min(X),size(X,1),1))./(repmat(max(X),...
          size(X,1),1)-repmat(min(X),size(X,1),1));
      
      % No permitimos que se edite este campo nuevamente:
      set(handles.edit17,'Enable','off');
      
      %%%
      % PROCESO DE PARTICION DE LOS DATOS
      %%%
      set(handles.text20,'String','Proceso de partición de los datos. Una vez obtenidos los datos, se realiza una partición de los mismos. Existen dos opciones: mediante el algoritmo pseudoaleatorio de Balasko y mediante el procedimeinto de cuantización vectorial.'); % Cuadro de información
      set(handles.uipanel3,'visible','on'); % panel de algoritmos
%       set(handles.radiobutton2,'FontWeight','bold'); % se muestra en negrita
%       set(handles.radiobutton3,'FontWeight','bold'); % se muestra en negrita
      % Alg. pseudoaleatorio:
      set(handles.text4,'visible','off'); % Numero de clases: texto fijo
      set(handles.edit5,'visible','off'); % Numero de clases: texto editable
      set(handles.text6,'visible','off'); % Peso exponencial: texto fijo
      set(handles.edit6,'visible','off'); % Peso exponencial: texto editable
      set(handles.text7,'visible','off'); % Criterio de terminacion: texto fijo
      set(handles.edit7,'visible','off'); % Criterio de terminacion: texto editable
      set(handles.text8,'visible','off'); % Numero maximo de iteraciones: texto fijo
      set(handles.edit8,'visible','off'); % Numero maximo de iteraciones: texto editable
      set(handles.pushbutton1,'visible','off'); % Botón aceptar
      % Alg. Cuant. Vect.:
      set(handles.text9,'visible','off'); % Umbral diferenciacion de clases: texto fijo
      set(handles.edit9,'visible','off'); % Umbral diferenciacion de clases: texto editable
      set(handles.text10,'visible','off'); % Peso exponencial: texto fijo
      set(handles.edit10,'visible','off'); % Peso exponencial: texto editable
      set(handles.text11,'visible','off'); % Criterio de terminacion: texto fijo
      set(handles.edit11,'visible','off'); % Criterio de terminacion: texto editable
      set(handles.text12,'visible','off'); % Numero maximo de iteraciones: texto fijo
      set(handles.edit12,'visible','off'); % Numero maximo de iteraciones: texto editable
      set(handles.pushbutton2,'visible','off'); % Botón aceptar      
      
      set(handles.pushbutton3,'visible','off'); % Botón nueva partición      
    end    
    set(handles.radiobutton6,'Enable','inactive'); % Ya no se puede seleccionar el botón APRENDIZAJE
    set(handles.radiobutton7,'Enable','inactive'); % Ya no se puede seleccionar el botón CLASIFICACIÓN
end

if (res3 == 1) % Se ha seleccionado AÑADIR nuevas muestras a las ya existentes            
    if exist('MuestrasAprendizaje.mat') ~= 0
        load MuestrasAprendizaje
        set(handles.text20,'String','Se han cargado las muestras existentes de procesos anteriores'); % Cuadro de información
    else
        X = [0 0 0];
        set(handles.text20,'String','No existen muestras de procesos anteriores. Es necesario introducir nuevas muestras de aprendizaje'); % Cuadro de información
    end
    [d1,d2] = size(X);    
    
    % Mostramos siguiente campo:
    set(handles.text18,'visible','on'); % ¿Seleccionar muestras con el ratón?: texto fijo
%     set(handles.text18,'FontWeight','bold'); % Mostrar en negrita
    set(handles.edit18,'visible','on'); % ¿Seleccionar muestras con el ratón?: texto editable 
    set(handles.edit18,'Enable','on'); % Permitimos que se edite este campo
    set(handles.text20,'String','Se pueden seleccionar las muestras con el ratón o ser el propio programa el que realice la selección.');
    % No permitimos que se edite este campo nuevamente:
    set(handles.edit17,'Enable','off');
%     set(handles.text17,'FontWeight','normal'); % no mostramos en negrita
    
    % numero de imágenes
    num_img = num_img + 1;
    
    if (num_img < 10)
        IO = imread(strcat('IEntrenamiento_0',num2str(num_img),'.bmp'));
    else
        IO = imread(strcat('IEntrenamiento_',num2str(num_img),'.bmp'));
    end
    
    %leer los datos de la imagen original
    step = 1;
    [M,N,s] = size(IO);
    I = IO(1:step:M,1:step:N,:);
    % Mostramos imagen:
    hold off
    imshow(I);    
    
    set(handles.radiobutton6,'Enable','inactive'); % Ya no se puede seleccionar el botón APRENDIZAJE
    set(handles.radiobutton7,'Enable','inactive'); % Ya no se puede seleccionar el botón CLASIFICACIÓN
end

% --- Executes during object creation, after setting all properties.
function edit17_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit17 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% --> ¿Seleccionar muestras con el raton?
function edit18_Callback(hObject, eventdata, handles)
% hObject    handle to edit18 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit18 as text
%        str2double(get(hObject,'String')) returns contents of edit18 as a double
global XO;

c = get(hObject,'String');
res = strcmpi(c,'s');
if (res == 1) % Se seleccionan muestras con el ratón:
    set(handles.text20,'String','Se activan los botones del ratón permitiendo seleccionar muestras con el botón izquierdo. Cuando no se deseen tomar más muestras de la imagen activa, se pulsa el botón derecho del ratón, en este momento se marcan sobre la imagen las muestras seleccionadas, localizándose con una serie de puntos azules.');
    [filas, columnas, XO] = impixel;
    [a,b] = size(filas);
    hold on
    for i=1:1:a
        plot(filas(i,:),columnas(i,:),'.b');
    end
    % Mostramos siguiente campo:
    set(handles.text19,'visible','on'); % ¿Mas imagenes de entrenamiento?: texto fijo
%     set(handles.text19,'FontWeight','bold'); % Mostrar en negrita
    set(handles.edit19,'visible','on'); % ¿Mas imagenes de entrenamiento?: texto editable    
    set(handles.edit18,'Enable','off'); % No permitimos que se edite este campo nuevamente
%     set(handles.text18,'FontWeight','normal'); % Mostrar normal el campo anterior
    set(handles.text20,'String','Se pregunta si desean tomar más muestras de más imágenes.'); % Cuadro de información
elseif (res == 0) && (1 == strcmpi(c,'n'))  
    set(handles.text20,'String','Se solicita el paso de muestreo'); % Cuadro de información
    % Mostramos el siguiente campo:
    set(handles.text3,'visible','on'); % Paso de muestreo: texto fijo
%     set(handles.text3,'FontWeight','bold'); % Mostrar en negrita este campo
    set(handles.edit2,'visible','on'); % Paso de muestreo: texto editable
    set(handles.edit2,'Enable','on'); % Permitimos que se edite este campo nuevamente:
    set(handles.edit18,'Enable','off'); % No permitimos que se edite este campo nuevamente
%     set(handles.text18,'FontWeight','normal'); % Mostrar normal el campo anterior    
else
    set(handles.text20,'String','Caracter introducido no valido. Escriba S (si) o N (no)'); % Cuadro de información
end



% --- Executes during object creation, after setting all properties.
function edit18_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit18 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% --> Paso de muestreo
function edit2_Callback(hObject, eventdata, handles)
% hObject    handle to edit2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit2 as text
%        str2double(get(hObject,'String')) returns contents of edit2 as a double

% En esta opción se seleccionan las muestras pro filas y columnas de forma 
% automática eleigiendo filas y columnas según el paso de muestreo elegido
global XO;
global I;

paso = str2double(get(hObject,'String')); % returns contents of edit2 as a double

if (isnan(paso) || (paso == 0)) % Comprobamos si el dato introducido es numérico o no:
    set(handles.text20,'String','Debe introducir un valor numérico natural positivo'); % Cuadro de información
else
    set(handles.text20,'String',''); % Cuadro de información
    barraprogreso % Crea la figura y determina el progreso

    [m,n,s] = size(I);
    h = 0;
    for i=1:paso:m
        for j=1:paso:n
            h = h + 1;
            XO(h,:) = double(I(i,j,:));
        end
        barraprogreso(i/m) % actualiza figura
    end

    % Mostramos siguiente campo:
    set(handles.text19,'visible','on'); % ¿Mas imagenes de entrenamiento?: texto fijo
%     set(handles.text19,'FontWeight','bold'); % Mostrar en negrita
    set(handles.edit19,'visible','on'); % ¿Mas imagenes de entrenamiento?: texto editable
    set(handles.edit19,'Enable','on'); % Permitimos que se edite este campo nuevamente:
%     set(handles.text3,'FontWeight','normal'); % Mostrar normal el campo anterior
    set(handles.edit2,'Enable','off'); % No permitimos que se edite este campo nuevamente:
    set(handles.text20,'String','Se pregunta si desean tomar más muestras de más imágenes.'); % Cuadro de información
end


% --- Executes during object creation, after setting all properties.
function edit2_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% --> ¿Mas imagenes de entrenamiento?
function edit19_Callback(hObject, eventdata, handles)
% hObject    handle to edit19 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit19 as text
%        str2double(get(hObject,'String')) returns contents of edit19 as a double
global X X1; % var global
global XO; % var global
global num_img;
global I;
global d1;
global MI MA;

c = get(hObject,'String');
res = strcmpi(c,'s');
if (res == 1) && (num_img < 5) % Seleccionamos nuevas imágenes de entrenamiento   
    X = [X;XO]; %concatenación
    XO = X;     % datos originales
    clear XO;
    
%     set(handles.text18,'FontWeight','bold'); % ¿Seleccionar muestras con el ratón?: Mostrar en negrita
    set(handles.text3,'visible','off'); % Paso de muestreo: texto fijo
%     set(handles.text3,'FontWeight','normal'); % Mostrar en negrita este campo
    set(handles.edit2,'visible','off'); % Paso de muestreo: texto editable
    set(handles.text19,'visible','off'); % ¿Mas imagenes de entrenamiento?: texto fijo
%     set(handles.text19,'FontWeight','normal'); % Mostrar en negrita
    set(handles.edit19,'visible','off'); % ¿Mas imagenes de entrenamiento?: texto editable
    set(handles.edit18,'Enable','on'); % Permitimos que se edite este campo nuevamente: "¿Seleccionar muestras con el ratón?"
    set(handles.text20,'String','Se pueden seleccionar las muestras con el ratón o ser el propio programa el que realice la selección.'); % Cuadro de información
    
    % numero de imágenes
    num_img = num_img + 1;

    if (num_img < 10)
        IO = imread(strcat('IEntrenamiento_0',num2str(num_img),'.bmp'));
    else
        IO = imread(strcat('IEntrenamiento_',num2str(num_img),'.bmp'));
    end

    %leer los datos de la imagen original
    step = 1;
    [M,N,s] = size(IO);
    I = IO(1:step:M,1:step:N,:);
    % Mostramos imagen:
    imshow(I);    
  
% Se ha alcanzado el número máximo de imágenes disponibles o no se desean mas imágenes de entrenamiento:    
elseif ((res == 1) && (num_img == 5)) || ((res == 0) && (1 == strcmpi(c,'n')))
    
    if (res == 1) && (num_img == 5)
        set(handles.text20,'String',['Se ha alcanzado el número máximo de imágenes de entrenamiento disponibles',char(10),char(10),'Proceso de partición de los datos. Una vez obtenidos los datos, se realiza una partición de los mismos. Existen dos opciones: mediante el algoritmo pseudoaleatorio de Balasko y mediante el procedimeinto de cuantización vectorial.']);
    else
        set(handles.text20,'String','Proceso de partición de los datos. Una vez obtenidos los datos, se realiza una partición de los mismos. Existen dos opciones: mediante el algoritmo pseudoaleatorio de Balasko y mediante el procedimeinto de cuantización vectorial.'); % Cuadro de información
    end
        
    X = [X;XO]; %concatenación
    XO = X;     % datos originales
    clear XO;

    % quitamos la primera fila de X, que se añadió al crearla:
    if d1 == 1
        [m,n] = size(X);
        X = X(2:1:m,:);
    end
    save MuestrasAprendizaje X

    % en X1 se mantienen los datos originales sin normalizar:
    X1 = X;
    % normalizacion de datos en el rango [0,1]:
    MI = min(X); %minimo
    MA = max(X); %maximo
    X = (X-repmat(min(X),size(X,1),1))./(repmat(max(X),...
        size(X,1),1)-repmat(min(X),size(X,1),1));

%     set(handles.text19,'FontWeight','normal'); % Mostrar normal el campo anterior
    set(handles.edit19,'Enable','off'); % NO permitimos que se edite este campo nuevamente

    %%%
    % PROCESO DE PARTICION DE LOS DATOS
    %%%    
    set(handles.uipanel3,'visible','on'); % panel de algoritmos
%     set(handles.radiobutton2,'FontWeight','bold'); % se muestra en negrita
%     set(handles.radiobutton3,'FontWeight','bold'); % se muestra en negrita
    % Alg. pseudoaleatorio:
    set(handles.text4,'visible','off'); % Numero de clases: texto fijo
    set(handles.edit5,'visible','off'); % Numero de clases: texto editable
    set(handles.text6,'visible','off'); % Peso exponencial: texto fijo
    set(handles.edit6,'visible','off'); % Peso exponencial: texto editable
    set(handles.text7,'visible','off'); % Criterio de terminacion: texto fijo
    set(handles.edit7,'visible','off'); % Criterio de terminacion: texto editable
    set(handles.text8,'visible','off'); % Numero maximo de iteraciones: texto fijo
    set(handles.edit8,'visible','off'); % Numero maximo de iteraciones: texto editable
    set(handles.pushbutton1,'visible','off'); % Botón aceptar
    % Alg. Cuant. Vect.:
    set(handles.text9,'visible','off'); % Umbral diferenciacion de clases: texto fijo
    set(handles.edit9,'visible','off'); % Umbral diferenciacion de clases: texto editable
    set(handles.text10,'visible','off'); % Peso exponencial: texto fijo
    set(handles.edit10,'visible','off'); % Peso exponencial: texto editable
    set(handles.text11,'visible','off'); % Criterio de terminacion: texto fijo
    set(handles.edit11,'visible','off'); % Criterio de terminacion: texto editable
    set(handles.text12,'visible','off'); % Numero maximo de iteraciones: texto fijo
    set(handles.edit12,'visible','off'); % Numero maximo de iteraciones: texto editable
    set(handles.pushbutton2,'visible','off'); % Botón aceptar
    
    set(handles.pushbutton3,'visible','off'); % Botón nueva partición
else
    set(handles.text20,'String','Caracter introducido no valido. Escriba S (si) o N (no)'); % Cuadro de información
end

% --- Executes during object creation, after setting all properties.
function edit19_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit19 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% --> Seleccionado radiobutton de ALGORITMO PSEUDOALEATORIO
% --- Executes on button press in radiobutton2.
function radiobutton2_Callback(hObject, eventdata, handles)
% hObject    handle to radiobutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of radiobutton2
c = get(hObject,'Value');
if (c == 1)
    set(handles.text20,'String','Se ha seleccionado partición de los datos mediante el Algoritmo de Fuzzy Clustering (Pseudoaleatorio)');
    % Alg. pseudoaleatorio:
    set(handles.text4,'visible','on'); % Numero de clases: texto fijo
    set(handles.edit5,'visible','on'); % Numero de clases: texto editable
    set(handles.text6,'visible','on'); % Peso exponencial: texto fijo
    set(handles.edit6,'visible','on'); % Peso exponencial: texto editable
    set(handles.text7,'visible','on'); % Criterio de terminacion: texto fijo
    set(handles.edit7,'visible','on'); % Criterio de terminacion: texto editable
    set(handles.text8,'visible','on'); % Numero maximo de iteraciones: texto fijo
    set(handles.edit8,'visible','on'); % Numero maximo de iteraciones: texto editable
    set(handles.pushbutton1,'visible','on'); % Botón aceptar
    % Alg. Cuant. Vect.:
    set(handles.text9,'visible','off'); % Umbral diferenciacion de clases: texto fijo
    set(handles.edit9,'visible','off'); % Umbral diferenciacion de clases: texto editable
    set(handles.text10,'visible','off'); % Peso exponencial: texto fijo
    set(handles.edit10,'visible','off'); % Peso exponencial: texto editable
    set(handles.text11,'visible','off'); % Criterio de terminacion: texto fijo
    set(handles.edit11,'visible','off'); % Criterio de terminacion: texto editable
    set(handles.text12,'visible','off'); % Numero maximo de iteraciones: texto fijo
    set(handles.edit12,'visible','off'); % Numero maximo de iteraciones: texto editable
    set(handles.pushbutton2,'visible','off'); % Botón aceptar    
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% --> Seleccionado radiobutton de algoritmo CUANTIZACIÓN VECTORIAL
% --- Executes on button press in radiobutton3.
function radiobutton3_Callback(hObject, eventdata, handles)
% hObject    handle to radiobutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of radiobutton3
c = get(hObject,'Value');
if (c == 1)
    set(handles.text20,'String','Se ha seleccionado partición de los datos mediante el Algoritmo Cuantización vectorial');
    
    % Alg. pseudoaleatorio:
    set(handles.text4,'visible','off'); % Numero de clases: texto fijo
    set(handles.edit5,'visible','off'); % Numero de clases: texto editable
    set(handles.text6,'visible','off'); % Peso exponencial: texto fijo
    set(handles.edit6,'visible','off'); % Peso exponencial: texto editable
    set(handles.text7,'visible','off'); % Criterio de terminacion: texto fijo
    set(handles.edit7,'visible','off'); % Criterio de terminacion: texto editable
    set(handles.text8,'visible','off'); % Numero maximo de iteraciones: texto fijo
    set(handles.edit8,'visible','off'); % Numero maximo de iteraciones: texto editable
    set(handles.pushbutton1,'visible','off'); % Botón aceptar
    % Alg. Cuant. Vect.:
    set(handles.text9,'visible','on'); % Umbral diferenciacion de clases: texto fijo
    set(handles.edit9,'visible','on'); % Umbral diferenciacion de clases: texto editable
    set(handles.text10,'visible','on'); % Peso exponencial: texto fijo
    set(handles.edit10,'visible','on'); % Peso exponencial: texto editable
    set(handles.text11,'visible','on'); % Criterio de terminacion: texto fijo
    set(handles.edit11,'visible','on'); % Criterio de terminacion: texto editable
    set(handles.text12,'visible','on'); % Numero maximo de iteraciones: texto fijo
    set(handles.edit12,'visible','on'); % Numero maximo de iteraciones: texto editable
    set(handles.pushbutton2,'visible','on'); % Botón aceptar   
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ALGORITMO PSEUDOALEATORIO: Parámetros:

% --> Numero de clases
function edit5_Callback(hObject, eventdata, handles)
% hObject    handle to edit5 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit5 as text
%        str2double(get(hObject,'String')) returns contents of edit5 as a double
global num_clases;

res = str2double(get(hObject,'String')); % returns contents of edit2 as a double
if (isnan(res) || (res == 0)) % Comprobamos si el dato introducido es numérico o no:
    set(handles.text20,'String','Debe introducir un valor numérico natural positivo'); % Cuadro de información
else
    set(handles.text20,'String',''); % Cuadro de información    
end
num_clases = res;

% --- Executes during object creation, after setting all properties.
function edit5_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit5 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

% --> Peso exponencial
function edit6_Callback(hObject, eventdata, handles)
% hObject    handle to edit6 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit6 as text
%        str2double(get(hObject,'String')) returns contents of edit6 as a double
global peso_exp1;

res = str2double(get(hObject,'String')); % returns contents of edit2 as a double
if (isnan(res) || (res == 0)) % Comprobamos si el dato introducido es numérico o no:
    set(handles.text20,'String','Debe introducir un valor numérico natural positivo'); % Cuadro de información
else
    set(handles.text20,'String',''); % Cuadro de información
end
peso_exp1 = res;

% --- Executes during object creation, after setting all properties.
function edit6_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit6 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

% --> Criterio de terminacion
function edit7_Callback(hObject, eventdata, handles)
% hObject    handle to edit7 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit7 as text
%        str2double(get(hObject,'String')) returns contents of edit7 as a double
global crit_term1;

res = str2double(get(hObject,'String')); % returns contents of edit2 as a double
if (isnan(res) || (res == 0)) % Comprobamos si el dato introducido es numérico o no:
    set(handles.text20,'String','Debe introducir un valor numérico natural positivo'); % Cuadro de información
else
    set(handles.text20,'String',''); % Cuadro de información    
end
crit_term1 = res;

% --- Executes during object creation, after setting all properties.
function edit7_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit7 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

% --> Numero maximo de iteraciones
function edit8_Callback(hObject, eventdata, handles)
% hObject    handle to edit8 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit8 as text
%        str2double(get(hObject,'String')) returns contents of edit8 as a double
global max_iter1;

res = str2double(get(hObject,'String')); % returns contents of edit2 as a double
if (isnan(res) || (res == 0)) % Comprobamos si el dato introducido es numérico o no:
    set(handles.text20,'String','Debe introducir un valor numérico natural positivo'); % Cuadro de información
else
    set(handles.text20,'String',''); % Cuadro de información    
end
max_iter1 = res;

% --- Executes during object creation, after setting all properties.
function edit8_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit8 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

% Botón ACEPTAR del ALGORITMO PSEUDOALEATORIO
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global num_clases peso_exp1 crit_term1 max_iter1;
global v;
global ALGORITMO_APRENDIZAJE;

c = get(hObject,'Value');
if (c == 1) % Se ha pulsado el botón:
    if ((~isnan(num_clases))&&(~isnan(peso_exp1))&&(~isnan(crit_term1))&&(~isnan(max_iter1)))
        mm = ['Número de clases: ',num2str(num_clases),', Peso exponencial: ',num2str(peso_exp1),', Criterio de terminación: ',num2str(crit_term1),', Nº máximo de iteraciones: ',num2str(max_iter1),'. '];
        mostrar = [mm,'Parámetros correctos. Comienza el algoritmo Pseudoaleatorio'];
        set(handles.text20,'String',mostrar); % Cuadro de información        
        
        ALGORITMO_APRENDIZAJE = 1; % Almacenamos en una var global el algoritmo que se está realizando.
        
        % Llamada a la función que implementa este algoritmo:
        [DATOS_CLASES] = algoritmo_pseudoaleatorio();
        % Validación de la partición:
        [v,DATOS_CLASES] = validacion_particion(num_clases,peso_exp1,crit_term1,max_iter1,DATOS_CLASES,handles);
        % Almacenar los datos en la base de conocimiento:
        save ParamAprendizaje DATOS_CLASES
        
        % Por defecto se representa en 3D
        representacion_aprendizaje_3dim(v,num_clases);
        
        set(handles.popupmenu2,'visible','on'); % menu de representación aprendizaje
        set(handles.popupmenu2,'Value',1); % menu de representación aprendizaje: Mostramos por defecto etiqueta '3 dimensiones'
        set(handles.pushbutton3,'visible','on'); % Botón nueva partición
        set(handles.edit5,'Enable','off'); % Numero de clases: texto editable
        set(handles.edit6,'Enable','off'); % Peso exponencial: texto editable
        set(handles.edit7,'Enable','off'); % Criterio de terminacion: texto editable
        set(handles.edit8,'Enable','off'); % Numero maximo de iteraciones: texto editable
        
        set(handles.radiobutton2,'Enable','inactive'); % Ya no se puede seleccionar el botón PSEUDOALEATORIO
        set(handles.radiobutton3,'Enable','inactive'); % Ya no se puede seleccionar el botón CUANTIZACION VECT.
        set(handles.pushbutton4,'visible','on'); % Botón clasificar tras finalizar el entrenamiento
        
    else
        set(handles.text20,'String','Alguno de los parámetros es incorrecto.'); % Cuadro de información
    end
end
        

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ALGORITMO CUANTIZACION VECTORIAL: Parámetros:

% --> Umbral diferenciacion de clases
function edit9_Callback(hObject, eventdata, handles)
% hObject    handle to edit9 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit9 as text
%        str2double(get(hObject,'String')) returns contents of edit9 as a double
global umb_dif_clases;

res = str2double(get(hObject,'String')); % returns contents of edit2 as a double
if (isnan(res) || (res == 0)) % Comprobamos si el dato introducido es numérico o no:
    set(handles.text20,'String','Debe introducir un valor numérico natural positivo'); % Cuadro de información
else
    set(handles.text20,'String',''); % Cuadro de información    
end
umb_dif_clases = res;

% --- Executes during object creation, after setting all properties.
function edit9_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit9 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

% --> Peso exponencial
function edit10_Callback(hObject, eventdata, handles)
% hObject    handle to edit10 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit10 as text
%        str2double(get(hObject,'String')) returns contents of edit10 as a double
global peso_exp2;

res = str2double(get(hObject,'String')); % returns contents of edit2 as a double
if (isnan(res) || (res == 0)) % Comprobamos si el dato introducido es numérico o no:
    set(handles.text20,'String','Debe introducir un valor numérico natural positivo'); % Cuadro de información
else
    set(handles.text20,'String',''); % Cuadro de información    
end
peso_exp2 = res;

% --- Executes during object creation, after setting all properties.
function edit10_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit10 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

% --> Criterio de terminacion
function edit11_Callback(hObject, eventdata, handles)
% hObject    handle to edit11 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit11 as text
%        str2double(get(hObject,'String')) returns contents of edit11 as a double
global crit_term2;

res = str2double(get(hObject,'String')); % returns contents of edit2 as a double
if (isnan(res) || (res == 0)) % Comprobamos si el dato introducido es numérico o no:
    set(handles.text20,'String','Debe introducir un valor numérico natural positivo'); % Cuadro de información
else
    set(handles.text20,'String',''); % Cuadro de información    
end
crit_term2 = res;

% --- Executes during object creation, after setting all properties.
function edit11_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit11 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

% --> Numero maximo de iteraciones
function edit12_Callback(hObject, eventdata, handles)
% hObject    handle to edit12 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit12 as text
%        str2double(get(hObject,'String')) returns contents of edit12 as a double
global max_iter2;

res = str2double(get(hObject,'String')); % returns contents of edit2 as a double
if (isnan(res) || (res == 0)) % Comprobamos si el dato introducido es numérico o no:
    set(handles.text20,'String','Debe introducir un valor numérico natural positivo'); % Cuadro de información
else
    set(handles.text20,'String',''); % Cuadro de información    
end
max_iter2 = res;

% --- Executes during object creation, after setting all properties.
function edit12_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit12 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

% Botón ACEPTAR del ALGORITMO CUANTIZACIÓN VECTORIAL
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global umb_dif_clases peso_exp2 crit_term2 max_iter2;
global v clases_cv;
global ALGORITMO_APRENDIZAJE;

c = get(hObject,'Value');
if (c == 1) % Se ha pulsado el botón:
    if ((~isnan(umb_dif_clases))&&(~isnan(peso_exp2))&&(~isnan(crit_term2))&&(~isnan(max_iter2)))
        mm = ['Umbral diferenciación de clases: ',num2str(umb_dif_clases),', Peso exponencial: ',num2str(peso_exp2),', Criterio de terminación: ',num2str(crit_term2),', Nº máximo de iteraciones: ',num2str(max_iter2),'. '];
        mostrar = [mm,'Parámetros correctos. Comienza el algoritmo Cuantización Vectorial.'];
        set(handles.text20,'String',mostrar); % Cuadro de información
        
        ALGORITMO_APRENDIZAJE = 2; % Almacenamos en una var global el algoritmo que se está realizando.
        
        % Llamada a la función que implementa este algoritmo:
        [DATOS_CLASES,clases_cv] = algoritmo_cuantizacion_vectorial();
        % Validación de la partición:        
        [v,DATOS_CLASES] = validacion_particion(clases_cv,peso_exp2,crit_term2,max_iter2,DATOS_CLASES,handles);
        % Almacenar los datos en la base de conocimiento:
        save ParamAprendizaje DATOS_CLASES
        
        % Por defecto se representa en 3D:
        representacion_aprendizaje_3dim(v,clases_cv);
        
        set(handles.popupmenu2,'visible','on'); % menu de representación aprendizaje
        set(handles.popupmenu2,'Value',1); % menu de representación aprendizaje: Mostramos por defecto etiqueta '3 dimensiones'
        set(handles.pushbutton3,'visible','on'); % Botón nueva partición
        set(handles.edit9,'Enable','off'); % Umbral diferenciacion de clases: texto editable
        set(handles.edit10,'Enable','off'); % Peso exponencial: texto editable
        set(handles.edit11,'Enable','off'); % Criterio de terminacion: texto editable
        set(handles.edit12,'Enable','off'); % Numero maximo de iteraciones: texto editable
        
        set(handles.radiobutton2,'Enable','inactive'); % Ya no se puede seleccionar el botón PSEUDOALEATORIO
        set(handles.radiobutton3,'Enable','inactive'); % Ya no se puede seleccionar el botón CUANTIZACION VECT.
        set(handles.pushbutton4,'visible','on'); % Botón clasificar tras finalizar el entrenamiento
        
    else
        set(handles.text20,'String','Alguno de los parámetros es incorrecto.'); % Cuadro de información
    end
end

% --> Botón Nueva partición
% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
c = get(hObject,'Value');
if (c == 1) % Se ha pulsado el botón:   
    %%%
    % PROCESO DE PARTICION DE LOS DATOS
    %%%
    set(handles.text20,'String','Proceso de partición de los datos. Una vez obtenidos los datos, se realiza una partición de los mismos. Existen dos opciones: mediante el algoritmo pseudoaleatorio de Balasko y mediante el procedimeinto de cuantización vectorial.'); % Cuadro de información
    set(handles.uipanel3,'visible','on'); % panel de algoritmos
%     set(handles.radiobutton2,'FontWeight','bold'); % se muestra en negrita
%     set(handles.radiobutton3,'FontWeight','bold'); % se muestra en negrita
    % Alg. pseudoaleatorio:
    set(handles.text4,'visible','off'); % Numero de clases: texto fijo
    set(handles.edit5,'visible','off'); % Numero de clases: texto editable
    set(handles.text6,'visible','off'); % Peso exponencial: texto fijo
    set(handles.edit6,'visible','off'); % Peso exponencial: texto editable
    set(handles.text7,'visible','off'); % Criterio de terminacion: texto fijo
    set(handles.edit7,'visible','off'); % Criterio de terminacion: texto editable
    set(handles.text8,'visible','off'); % Numero maximo de iteraciones: texto fijo
    set(handles.edit8,'visible','off'); % Numero maximo de iteraciones: texto editable
    set(handles.pushbutton1,'visible','off'); % Botón aceptar
    % Alg. Cuant. Vect.:
    set(handles.text9,'visible','off'); % Umbral diferenciacion de clases: texto fijo
    set(handles.edit9,'visible','off'); % Umbral diferenciacion de clases: texto editable
    set(handles.text10,'visible','off'); % Peso exponencial: texto fijo
    set(handles.edit10,'visible','off'); % Peso exponencial: texto editable
    set(handles.text11,'visible','off'); % Criterio de terminacion: texto fijo
    set(handles.edit11,'visible','off'); % Criterio de terminacion: texto editable
    set(handles.text12,'visible','off'); % Numero maximo de iteraciones: texto fijo
    set(handles.edit12,'visible','off'); % Numero maximo de iteraciones: texto editable
    set(handles.pushbutton2,'visible','off'); % Botón aceptar
    
    set(handles.pushbutton3,'visible','off'); % Botón nueva partición   
    set(handles.axes2,'visible','off'); % Cuadro de imagen
    set(handles.popupmenu2,'visible','off'); % menu de representación aprendizaje
    
    set(handles.edit5,'Enable','on'); % Numero de clases: texto editable
    set(handles.edit6,'Enable','on'); % Peso exponencial: texto editable
    set(handles.edit7,'Enable','on'); % Criterio de terminacion: texto editable
    set(handles.edit8,'Enable','on'); % Numero maximo de iteraciones: texto editable
    set(handles.edit9,'Enable','on'); % Umbral diferenciacion de clases: texto editable
    set(handles.edit10,'Enable','on'); % Peso exponencial: texto editable
    set(handles.edit11,'Enable','on'); % Criterio de terminacion: texto editable
    set(handles.edit12,'Enable','on'); % Numero maximo de iteraciones: texto editable
    
    cla(handles.axes2); % borra las curvas existentes en la ventana de gráficas y redibuja los ejes coordenados.
    
    set(handles.radiobutton2,'Enable','on'); % Se puede seleccionar el botón PSEUDOALEATORIO
    set(handles.radiobutton2,'value',0); % Aparece sin marcar el rediobutton 'pseudoaleatorio'
    set(handles.radiobutton3,'Enable','on'); % Se puede seleccionar el botón CUANTIZACION VECT.    
    set(handles.radiobutton3,'value',0); % Aparece sin marcar el rediobutton 'cuantizacion vectorial'
    
    set(handles.pushbutton4,'visible','off'); % Botón clasificar tras finalizar el entrenamiento
end

% --> Menú de elección del tipo de representación (3 o 2 dimensiones)
% --- Executes on selection change in popupmenu2.
function popupmenu2_Callback(hObject, eventdata, handles)
% hObject    handle to popupmenu2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hints: contents = get(hObject,'String') returns popupmenu2 contents as cell array
%        contents{get(hObject,'Value')} returns selected item from popupmenu2
global v num_clases clases_cv;
global ALGORITMO_APRENDIZAJE;

res = get(hObject,'Value');
if (res == 1) % representacion en 3 dimensiones:
    if (ALGORITMO_APRENDIZAJE == 1) % Alg. pseudoaleatorio
        representacion_aprendizaje_3dim(v,num_clases);
    elseif (ALGORITMO_APRENDIZAJE == 2) % Alg. Cuantización vect.
        representacion_aprendizaje_3dim(v,clases_cv);
    end
elseif (res == 2) % representacion en 2 dimensiones:
    if (ALGORITMO_APRENDIZAJE == 1) % Alg. pseudoaleatorio
        representacion_aprendizaje_2dim(v,num_clases);
    elseif (ALGORITMO_APRENDIZAJE == 2) % Alg. Cuantización vect.
        representacion_aprendizaje_2dim(v,clases_cv);
    end
        
end
guidata(hObject,handles);

function popupmenu2_OpeningFcn(hObject, eventdata, handles, varargin)

global v num_clases clases_cv;
global ALGORITMO_APRENDIZAJE;

if (ALGORITMO_APRENDIZAJE == 1) % Alg. pseudoaleatorio
    representacion_aprendizaje_3dim(v,num_clases);
elseif (ALGORITMO_APRENDIZAJE == 2) % Alg. Cuantización vect.
    representacion_aprendizaje_3dim(v,clases_cv);
end

% --- Executes during object creation, after setting all properties.
function popupmenu2_CreateFcn(hObject, eventdata, handles)
% hObject    handle to popupmenu2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called
% Hint: popupmenu controls usually have a white background on Windows.
%       See ISPC and COMPUTER.

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%% CLASIFICACION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% --> Factor de submuestreo
function edit14_Callback(hObject, eventdata, handles)
% hObject    handle to edit14 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit14 as text
%        str2double(get(hObject,'String')) returns contents of edit14 as a double
global step;
global num_img_clasif;

step = str2double(get(hObject,'String')); % returns contents of edit2 as a double
if (isnan(step) || mod(log2(step),1)) % Comprobamos si el dato introducido es numérico y potencia de 2
    set(handles.text20,'String','Debe introducir un valor numérico natural positivo potencia de 2, es decir, 1, 2, 4, 8, 16, etc. Si se elige un factor bajo, el coste computacional del proceso puede ser elevado'); % Cuadro de información
else
    set(handles.text20,'String','Se solicita el factor h de la ventana de Parzen '); % Cuadro de información
    num_img_clasif = 0;
    % Proceso iterativo de clasificación:
    factor_submuestreo(handles);
    
%     set(handles.text14,'FontWeight','normal');% Factor de submuestreo: texto fijo
    set(handles.edit14,'Enable','off');
    set(handles.text15,'visible','on'); % Parametro h de la ventana de Parzen: texto fijo
    set(handles.edit15,'visible','on'); % Parametro h de la ventana de Parzen: texto editable
%     set(handles.text15,'FontWeight','bold'); % mostramos en negrita
    
    set(handles.radiobutton6,'Enable','inactive'); % Ya no se puede seleccionar el botón APRENDIZAJE
    set(handles.radiobutton7,'Enable','inactive'); % Ya no se puede seleccionar el botón CLASIFICACIÓN        
end

% --- Executes during object creation, after setting all properties.
function edit14_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit14 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

% --> Parametro h de la ventana de Parzen
function edit15_Callback(hObject, eventdata, handles)
% hObject    handle to edit15 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit15 as text
%        str2double(get(hObject,'String')) returns contents of edit15 as a double
global h;

h = str2double(get(hObject,'String')); % returns contents of edit2 as a double
if (isnan(h) || (h == 0)) % Comprobamos si el dato introducido es numérico o no:
    set(handles.text20,'String','Debe introducir un valor numérico natural positivo'); % Cuadro de información
else
    set(handles.text20,'String',['Se solicita la competencia de cada clasificador (Fuzzy, Bayes y Parzen) en la Integral Fuzzy',char(10),char(10),'Las compentencias de los clasificadores tienen que estar ordenadas de menor a mayor, es decir, g1 <= g2 <= g3']); % Cuadro de información
    
    set(handles.edit15,'Enable','off');
    set(handles.text22,'visible','on'); % Parámetro g de la Integral Fuzzy: texto fijo
    set(handles.edit22,'visible','on'); % Parámetro g de la Integral Fuzzy: texto editable 1
    set(handles.edit22,'Enable','on'); % g1 editable
    set(handles.edit23,'visible','on'); % Parámetro g de la Integral Fuzzy: texto editable 2
    set(handles.edit23,'Enable','on'); % g2 editable
    set(handles.edit24,'visible','on'); % Parámetro g de la Integral Fuzzy: texto editable 3 
    set(handles.edit24,'Enable','on'); % g3 editable
    set(handles.pushbutton5,'Enable','on'); % botón ok se puede pulsar
    set(handles.pushbutton5,'visible','on'); % botón ok integral fuzzy    
end

% --- Executes during object creation, after setting all properties.
function edit15_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit15 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

% --> Parametro g1 de la Integral Fuzzy
function edit22_Callback(hObject, eventdata, handles)
% hObject    handle to edit22 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit22 as text
%        str2double(get(hObject,'String')) returns contents of edit22 as a double
global g1;

res = str2double(get(hObject,'String')); % returns contents of edit2 as a double
if (isnan(res) || (res <= 0.0) || (res >= 1.0)) % Comprobamos si el dato introducido es numérico o no y si está en el rango [0,1]:
    set(handles.text20,'String','Debe introducir un valor numérico en el rango [0,1]'); % Cuadro de información
else
    set(handles.text20,'String',''); % Cuadro de información
end
g1 = res;

% --- Executes during object creation, after setting all properties.
function edit22_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit22 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

% --> Parametro g2 de la Integral Fuzzy
function edit23_Callback(hObject, eventdata, handles)
% hObject    handle to edit23 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit23 as text
%        str2double(get(hObject,'String')) returns contents of edit23 as a double
global g2;

res = str2double(get(hObject,'String')); % returns contents of edit2 as a double
if (isnan(res) || (res <= 0.0) || (res >= 1.0)) % Comprobamos si el dato introducido es numérico o no y si está en el rango [0,1]:
    set(handles.text20,'String','Debe introducir un valor numérico en el rango [0,1]'); % Cuadro de información
else
    set(handles.text20,'String',''); % Cuadro de información
end
g2 = res;

% --- Executes during object creation, after setting all properties.
function edit23_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit23 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

% --> Parametro g3 de la Integral Fuzzy
function edit24_Callback(hObject, eventdata, handles)
% hObject    handle to edit24 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit24 as text
%        str2double(get(hObject,'String')) returns contents of edit24 as a double
global g3;

res = str2double(get(hObject,'String')); % returns contents of edit2 as a double
if (isnan(res) || (res <= 0.0) || (res >= 1.0)) % Comprobamos si el dato introducido es numérico o no y si está en el rango [0,1]:
    set(handles.text20,'String','Debe introducir un valor numérico en el rango [0,1]'); % Cuadro de información
else
    set(handles.text20,'String',''); % Cuadro de información
end
g3 = res;

% --- Executes during object creation, after setting all properties.
function edit24_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit24 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

% --> Pulsar el botón OK de la Integral Fuzzy
function pushbutton5_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton5 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global g1 g2 g3;
global h; % parámetro h de la ventana de Parzen
global colores c;
global M N s;
global pixel;
global ClasesFuzzy

res = get(hObject,'Value');
if (res == 1) % Se ha pulsado el botón:
    if ((~isnan(g1))&&(~isnan(g2))&&(~isnan(g3))) % son datos numéricos
        if ((g1 >= 0.0)&&(g1 <= 1.0)&&(g2 >= 0.0)&&(g2 <= 1.0)&&(g3 >= 0.0)&&(g3 <= 1.0)) % están en el rango [0,1]
            if((g1 <= g2)&&(g1 <= g3)&&(g2 <= g3)) % están ordenados de menor a mayor
                mm = ['g1: ',num2str(g1),', g2: ',num2str(g2),', g3: ',num2str(g3),'. '];
                mostrar = [mm,'Parámetros correctos.'];
                set(handles.text20,'String',mostrar); % Cuadro de información

                clasificar(h,M,N,s,c,colores,pixel,g1,g2,g3);

                set(handles.popupmenu3,'visible','on'); % menu de representacion clasificación
                set(handles.popupmenu3,'Value',1); % Mostramos por defecto etiqueta 'Clasificador Fuzzy'

                set(handles.edit22,'Enable','off'); % g1 no editable
                set(handles.edit23,'Enable','off'); % g2 no editable
                set(handles.edit24,'Enable','off'); % g3 no editable
                set(handles.pushbutton5,'Enable','off'); % botón ok no se puede pulsar
                set(handles.text21,'visible','on'); % ¿Más imágenes de clasificación?: texto fijo
                set(handles.edit21,'visible','on'); % ¿Más imágenes de clasificación?: texto editable

                % Mostramos resultados del clasificador Fuzzy por defecto:
                imshow(ClasesFuzzy);
                set(handles.text20,'String','Resultados Clasificador Borroso'); % Cuadro de información
            else
                set(handles.text20,'String',['Alguno de los parámetros es incorrecto. Debe cumplirse la siguiente restricción:',char(10),'g1 <= g2 <= g3']); % Cuadro de información
            end
        else
            set(handles.text20,'String','Alguno de los parámetros es incorrecto. Debe introducir valores numéricos en el rango [0,1]'); % Cuadro de información
        end
    else
        set(handles.text20,'String','Alguno de los parámetros es incorrecto. Debe introducir valores numéricos en el rango [0,1]'); % Cuadro de información
    end
end

% --> ¿Más imagenes de clasificacion?
function edit21_Callback(hObject, eventdata, handles)
% hObject    handle to edit21 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit21 as text
%        str2double(get(hObject,'String')) returns contents of edit21 as a double
global num_img_clasif;

c = get(hObject,'String');
res = strcmpi(c,'s');
if (res == 1) && (num_img_clasif < 5) % Seleccionamos nuevas imágenes de clasificación

    factor_submuestreo(handles);
    
    set(handles.text15,'visible','on'); % Parametro h de la ventana de Parzen: texto fijo
    set(handles.edit15,'visible','on'); % Parametro h de la ventana de Parzen: texto editable
    set(handles.edit15,'Enable','on');
%     set(handles.text15,'FontWeight','bold');
    set(handles.text22,'visible','off'); % Parámetro g de la Integral Fuzzy: texto fijo
    set(handles.edit22,'visible','off'); % Parámetro g de la Integral Fuzzy: texto editable 1
    set(handles.edit23,'visible','off'); % Parámetro g de la Integral Fuzzy: texto editable 2
    set(handles.edit24,'visible','off'); % Parámetro g de la Integral Fuzzy: texto editable 3 
    set(handles.pushbutton5,'visible','off'); % botón ok integral fuzzy
    set(handles.text21,'visible','off'); % ¿Más imágenes de clasificación?: texto fijo
    set(handles.edit21,'visible','off'); % ¿Más imágenes de clasificación?: texto editable 
    set(handles.popupmenu3,'visible','off'); % menu de representacion clasificación
    
    set(handles.text20,'String','Se solicita el factor h de la ventana de Parzen '); % Cuadro de información
    
elseif (res == 1) && (num_img_clasif == 5) % se ha alcanzado el número máximo de imágenes disponibles:
    set(handles.text20,'String',['Se ha alcanzado el número máximo de imágenes de entrenamiento disponibles.',char(10),char(10),'Ha finalizado el proceso de clasificación']);
    
elseif (res == 0) && (1 == strcmpi(c,'n')) % no se desean mas imágenes de entrenamiento:    
    set(handles.text20,'String',['Ha finalizado el proceso de clasificación',char(10),char(10),'FINALIZA EL PROGRAMA',char(10),char(10),'Se cerrará en 5 segundos']);
    pause(5); % en cinco segundos se cierra el programa.
    clear all; close all;
else
    set(handles.text20,'String','Caracter introducido no valido. Escriba S (si) o N (no)'); % Cuadro de información
end

% --- Executes during object creation, after setting all properties.
function edit21_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit21 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on selection change in popupmenu3.
function popupmenu3_Callback(hObject, eventdata, handles)
% hObject    handle to popupmenu3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hints: contents = get(hObject,'String') returns popupmenu3 contents as cell array
%        contents{get(hObject,'Value')} returns selected item from popupmenu3
global ClasesFuzzy ClasesBayes ClasesParzen;
global ClasesYagerUnion ClasesYagerIntersec ClasesYagerUnInt ClasesYagerIntUn ClasesMaxRule ClasesMinRule ClasesMedianRule ClasesIntegralFuzzy ClasesMajorityVote;

res = get(hObject,'Value');
if (res == 1) % Fuzzy
    imshow(ClasesFuzzy);
    set(handles.text20,'String','Resultados Clasificador Borroso'); % Cuadro de información
elseif (res == 2) % Bayes
    imshow(ClasesBayes);
    set(handles.text20,'String','Resultados Clasificador paramétrico máxima verosimilitud'); % Cuadro de información
elseif (res == 3) % Parzen
    imshow(ClasesParzen);
    set(handles.text20,'String','Resultados Clasificador no paramétrico ventana de Parzen'); % Cuadro de información
elseif (res == 4) % Yager: (Fuzzy U Bayes) U Parzen
    imshow(ClasesYagerUnion);
    set(handles.text20,'String','Resultados Clasificador Híbrido. Yager: (Fuzzy U Bayes) U Parzen'); % Cuadro de información
elseif (res == 5) % Yager: (Fuzzy ^ Bayes) ^ Parzen
    imshow(ClasesYagerIntersec);
    set(handles.text20,'String','Resultados Clasificador Híbrido. Yager: (Fuzzy ^ Bayes) ^ Parzen'); % Cuadro de información
elseif (res == 6) % Yager: (Fuzzy U Bayes) ^ Parzen
    imshow(ClasesYagerUnInt);
    set(handles.text20,'String','Resultados Clasificador Híbrido. Yager: (Fuzzy U Bayes) ^ Parzen'); % Cuadro de información
elseif (res == 7) % Yager: (Fuzzy ^ Bayes) U Parzen
    imshow(ClasesYagerIntUn);
    set(handles.text20,'String','Resultados Clasificador Híbrido. Yager: (Fuzzy ^ Bayes) U Parzen'); % Cuadro de información
elseif (res == 8) % Max Rule: Fuzzy + Bayes + Parzen
    imshow(ClasesMaxRule);
    set(handles.text20,'String','Resultados Clasificador Híbrido. Max Rule: Fuzzy + Bayes + Parzen'); % Cuadro de información
elseif (res == 9) % Min Rule: Fuzzy + Bayes + Parzen
    imshow(ClasesMinRule);
    set(handles.text20,'String','Resultados Clasificador Híbrido. Min Rule: Fuzzy + Bayes + Parzen'); % Cuadro de información
elseif (res == 10) % Median Rule: Fuzzy + Bayes + Parzen
    imshow(ClasesMedianRule);
    set(handles.text20,'String','Resultados Clasificador Híbrido. Median Rule: Fuzzy + Bayes + Parzen'); % Cuadro de información
elseif (res == 11) % Integral Fuzzy
    imshow(ClasesIntegralFuzzy);
    set(handles.text20,'String','Resultados Clasificador Híbrido. Integral Fuzzy'); % Cuadro de información
elseif (res == 12) % Majority Vote Rule: Fuzzy + Bayes + Parzen
    imshow(ClasesMajorityVote);
    set(handles.text20,'String','Resultados Clasificador Híbrido. Majority Vote Rule: Fuzzy + Bayes + Parzen'); % Cuadro de información
end
guidata(hObject,handles);

function popupmenu3_OpeningFcn(hObject, eventdata, handles, varargin)

global ClasesFuzzy;

imshow(ClasesFuzzy);
set(handles.text20,'String','Resultados Clasificador Borroso'); % Cuadro de información

% --- Executes during object creation, after setting all properties.
function popupmenu3_CreateFcn(hObject, eventdata, handles)
% hObject    handle to popupmenu3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: popupmenu controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');    
end



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% % --- Executes when selected object is changed in uipanel4.
% function uipanel3_SelectionChangeFcn(hObject, eventdata, handles)
% % hObject    handle to the selected object in uipanel4 
% % eventdata  reserved - to be defined in a future version of MATLAB
% % handles    structure with handles and user data (see GUIDATA)
% h = get(handles.uipanel3,'SelectedObject');
% s = get(h,'String');
% res1 = 'Pseudoaleatorio';
% res2 = 'Cuantizacion vectorial';
% res_1 = strcmp(s,res1);
% res_2 = strcmp(s,res2);
% if (res_1 == 1)
%     set(handles.text20,'String','Seleccionado Alg. pseudoaleatorio');
%     disp('Seleccionado Alg. pseudoaleatorio');
% elseif (res_2 == 1)
%     set(handles.text20,'String','Seleccionado Alg. Cuantiz. vect.');
%     disp('Seleccionado Alg. Cuantiz. vect.');
% end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% --- Executes when selected object is changed in uipanel4.
function uipanel4_SelectionChangeFcn(hObject, eventdata, handles)
% hObject    handle to the selected object in uipanel4 
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

h = get(handles.uipanel4,'SelectedObject');
s = get(h,'String');
res1 = 'APRENDIZAJE';
res2 = 'CLASIFICACION';
res_1 = strcmp(s,res1);
res_2 = strcmp(s,res2);
if (res_1 == 1)
    cla(handles.axes2); % borra las curvas existentes en la ventana de gráficas y redibuja los ejes coordenados.
    set(handles.text20,'String',['Se pregunta si se van a tomar nuevas muestras de aprendizaje o por el contrario, sirven las ya existentes de otros procesos anteriores.',char(10),char(10),'En el proceso de Aprendizaje, existe la posibilidad de:',char(10),'(S) Introducir nuevas muestras.',char(10),'(A) Añadir nuevas muestras a las ya existentes de otros procesos de aprendizaje previos.',char(10),'(N) Sirven únicamente las ya existentes de otros procesos anteriores.']);
    set(handles.radiobutton6,'value',1);
    set(handles.radiobutton7,'value',0); 
    set(handles.edit17,'Enable','on'); % ¿Nuevos datos?: SI se puede escribir
    set(handles.text17,'visible','on'); % ¿Nuevos datos?: texto fijo
    set(handles.edit17,'visible','on'); % ¿Nuevos datos?: texto editable
%     set(handles.text17,'FontWeight','bold'); % mostramos en negrita
    set(handles.text14,'visible','off'); % Factor de submuestreo: texto fijo
    set(handles.edit14,'visible','off'); % Factor de submuestreo: texto editable
elseif (res_2 == 1)
    cla(handles.axes2); % borra las curvas existentes en la ventana de gráficas y redibuja los ejes coordenados.
    set(handles.text20,'String','Se pregunta si se van a tomar nuevas muestras de aprendizaje o por el contrario, sirven las ya existentes de otros procesos anteriores');
    set(handles.radiobutton6,'value',0);
    set(handles.radiobutton7,'value',1);
    set(handles.edit14,'Enable','on'); % Factor de submuestreo: SI se puede escribir
    set(handles.text17,'visible','off'); % ¿Nuevos datos?: texto fijo
    set(handles.edit17,'visible','off'); % ¿Nuevos datos?: texto editable
    set(handles.text14,'visible','on'); % Factor de submuestreo: texto fijo
    set(handles.edit14,'visible','on'); % Factor de submuestreo: texto editable
%     set(handles.text14,'FontWeight','normal'); % mostramos en negrita
    
    representacion_centros(handles);
end

% visible = 'on';
% novisible = 'off';  
% set(handles.text17,'visible',novisible); % ¿Nuevos datos?: texto fijo
% set(handles.edit17,'visible',novisible); % ¿Nuevos datos?: texto editable
% set(handles.text18,'visible',novisible); % ¿Seleccionar muestras con el ratón?: texto fijo
% set(handles.edit18,'visible',novisible); % ¿Seleccionar muestras con el ratón?: texto editable
% set(handles.text19,'visible',novisible); % ¿Más imagenes de entrenamiento?: texto fijo
% set(handles.edit19,'visible',novisible); % ¿Más imagenes de entrenamiento?: texto editable
% set(handles.text3,'visible',novisible); % Paso de muestreo: texto fijo
% set(handles.edit2,'visible',novisible); % Paso de muestreo: texto editable
% %set(handles.checkbox4,'visible','on'); % Elección de algoritmo: Pseudoaleatorio/Cuantizacion vectorial
% set(handles.uipanel3,'visible',novisible); % panel de algoritmos
%     set(handles.text4,'visible',novisible); % Numero de clases: texto fijo
%     set(handles.edit5,'visible',novisible); % Numero de clases: texto editable
%     set(handles.text6,'visible',novisible); % Peso exponencial: texto fijo
%     set(handles.edit6,'visible',novisible); % Peso exponencial: texto editable
%     set(handles.text7,'visible',novisible); % Criterio de terminacion: texto fijo
%     set(handles.edit7,'visible',novisible); % Criterio de terminacion: texto editable
%     set(handles.text8,'visible',novisible); % Umbral diferenciacion de clases: texto fijo
%     set(handles.edit8,'visible',novisible); % Umbral diferenciacion de clases: texto editable
%     set(handles.text9,'visible',novisible); % Numero de clases: texto fijo
%     set(handles.edit9,'visible',novisible); % Numero de clases: texto editable
%     set(handles.text10,'visible',novisible); % Peso exponencial: texto fijo
%     set(handles.edit10,'visible',novisible); % Peso exponencial: texto editable
%     set(handles.text11,'visible',novisible); % Criterio de terminacion: texto fijo
%     set(handles.edit11,'visible',novisible); % Criterio de terminacion: texto editable
%     set(handles.text12,'visible',novisible); % Numero maximo de iteraciones: texto fijo
%     set(handles.edit12,'visible',novisible); % Numero maximo de iteraciones: texto editable
%     set(handles.pushbutton3,'visible',novisible); % ¿ Intentar nueva particion?
% set(handles.text14,'visible',novisible); % Factor de submuestreo: texto fijo
% set(handles.edit14,'visible',novisible); % Factor de submuestreo: texto editable
% set(handles.text15,'visible',novisible); % Parametro h de la ventana de Parzen: texto fijo
% set(handles.edit15,'visible',novisible); % Parametro h de la ventana de Parzen: texto editable

% Se ha pulsado el botón 'clasificar' despues de finalizar el entrenamiento
% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton4 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

c = get(hObject,'Value');
if (c == 1) % Se ha pulsado el botón:       
    set(handles.radiobutton6,'value',0);
    set(handles.radiobutton7,'value',1); % Aparece marcado el rediobutton 'clasificar'
    
    set(handles.text14,'visible','on'); % Factor de submuestreo: texto fijo
    set(handles.edit14,'visible','on'); % Factor de submuestreo: texto editable
    
    set(handles.pushbutton1,'Enable','inactive'); % botón aceptar alg. pseudo.
    set(handles.pushbutton2,'Enable','inactive'); % botón aceptar alg. cuant. vect.
    set(handles.pushbutton3,'Enable','inactive'); % botón nueva partición
    set(handles.pushbutton4,'Enable','inactive'); % botón clasificar tras entrenamiento
    set(handles.popupmenu2,'visible','off'); % menu de representación aprendizaje
    
    set(handles.radiobutton6,'Enable','inactive'); % Ya no se puede seleccionar el botón APRENDIZAJE
    set(handles.radiobutton7,'Enable','inactive'); % Ya no se puede seleccionar el botón CLASIFICACIÓN
    
    representacion_centros(handles);
end