⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 createdata.m

📁 用matlab实现的统计模式识别工具箱
💻 M
📖 第 1 页 / 共 2 页
字号:
function result = createdata(action,varargin)
% CREATEDATA Interactive data generator.
%
% Synopsis:
%  createdata
%  createdata('finite')
%  createdata('finite',num_classes)
%  createdata('gauss')
%  createdata('gauss',num_distrib)
%
% Description:
%  createdata or createdata('finite') invokes an interactive generator 
%  of finite point sets in 2D. The generated points can be assigned 
%  into two classes (1,2). The generator saves data to a 
%  specified file. The file has the following fields:
%   X [2 x num_data] 2D vectors.
%   y [1 x num_data] Assigned labels.
%
%  createdata('finite',num_classes) when num_classes is specified
%   then the points can be assigned labels from 1 to num_classes.
%  
%  createdata('gauss') invokes an interactive generator of 
%   Gaussian distributions. A user can specify mean vector and
%   covariance matrix. The generator saves data to a file
%   having the following fields:
%    Mean [2 x ncomp] Mean vectors.
%    Cov [2 x 2 x ncomp] Covariance matrices.
%    y [1 x ncomp] Assigned labels.
%
%  createdata('gauss',num_classes) when num_classes is specified
%   then the distributions can be assigned labels from 1 to num_classes.
%  
%  The data generator is controlled by mouse:
%    Left button  ... creates a new point or Gaussian.
%    Right button ... erases the focused point or Gaussian.
%
%  In the case of generating Gaussians left button double-click makes
%  selected Gaussian focused. The covariance matrix of focused 
%  Gaussian can be modified.
%

% About: Statistical Pattern Recognition Toolbox
% (C) 1999-2003, Written by Vojtech Franc and Vaclav Hlavac 
% <a href="http://www.cvut.cz">Czech Technical University Prague</a>
% <a href="http://www.feld.cvut.cz">Faculty of Electrical Engineering</a>
% <a href="http://cmp.felk.cvut.cz">Center for Machine Perception</a>
                                                                                
% Modifications:   
% 01-may-2004, VF
% 13-Feb-2003, VF  


XCOLORS=['r','b','g','m','c','k','y'];      % colors of the ellipses
MAXCOLOR=size(XCOLORS,2);
ID_NORMAL='Infinite sets, Normal distributions';
ID_FINITE='Finite sets, Enumeration';
DX_SPACE=0.5;   % space betwean the nearest point and the left and right border
DY_SPACE=0.5;   % --//--                                  top and bottom -//-

if nargin < 1,
   action = 'finite';
end

switch lower(action)
case 'finite'
   % == We will create finite data sets ===================================
   if nargin < 2,
      K=2;
   else
      K=varargin{1};
   end
   createdata('initialize',action,K,varargin{2:nargin-1});

case 'gauss'
   % == We will create gaussian distributed sets  ===========================
   if nargin < 2,
      K=2;
   else
      K=varargin{1};
   end
   createdata('initialize',action,K,varargin{2:nargin-1});


case 'initialize'
   % == Initialize dialog window =========================================

   % get input arguments
   K=varargin{2};

   % == Figure ===========================================================
   hfigure = figure(...
      'Visible','off',...
    'NumberTitle','off', ...
       'Units','normalized', ...
      'RendererMode','manual');

   % == Axes =============================================================
   haxes1= axes(...
       'Units','normalized', ...
      'ButtonDownFcn','createdata(''click'',gcf)',...
      'Box','on', ...
      'XGrid','on', ...
      'YGrid','on', ...
      'NextPlot','add',...
      'Position',[0.1 0.1 0.65 0.85]);
   axis([-1 1 -1 1]);
   xlabel('X');
   ylabel('Y');


   % == Buttons ==========================================================
   left=0.8;
   bottom=0.05;
   height=0.05;
   width=0.15;

   % close button
   hbtclose = uicontrol( ...
      'Units','Normalized', ...
      'Callback','createdata(''close'',gcf)',...
        'ListboxTop',0, ...
        'Position',[left bottom width height], ...
        'String','Close');

   % ok button
   bottom=bottom+1*height;
   hbtok = uicontrol( ...
      'Units','Normalized', ...
      'Callback','createdata(''ok'',gcf)',...
        'ListboxTop',0, ...
      'UserData',varargin,...
      'Position',[left bottom width height], ...
        'String','OK');

   % info button
   bottom=bottom+1.5*height;
   hbtinfo = uicontrol( ...
      'Units','Normalized', ...
      'Callback','createdata(''info'',gcf)',...
        'ListboxTop',0, ...
        'Position',[left bottom width height], ...
        'String','Info');

   % load button
   bottom=bottom+1.5*height;
   hbtload = uicontrol( ...
      'Units','Normalized', ...
      'Callback','createdata(''load'',gcf)',...
        'ListboxTop',0, ...
        'Position',[left bottom width height], ...
        'String','Load');

   % save button
   file=struct('name','noname.mat','path','','pathname','noname.mat');
   bottom=bottom+1*height;
   hbtsave = uicontrol( ...
      'Units','Normalized', ...
      'Callback','createdata(''save'',gcf)',...
        'ListboxTop',0, ...
      'Position',[left bottom width height], ...
      'UserData',file,...
        'String','Save');

   % == Popup menus ===================================================

   % popup menu - class
   % title
   bottom=0.91;
   htxclass =uicontrol( ...
      'Style','text', ...
      'Units','normalized', ...
      'Position',[left bottom width 0.9*height], ...
      'String','Class');

   % popup menu
   for i=1:K,
      txnum=sprintf(' %d ',i);
      classes(i,1:size(txnum,2))=txnum;
   end

   bottom=bottom-height;
   hpuclass=uicontrol( ...
      'Style','popup', ...
      'Units','normalized', ...
      'Position',[left bottom width height], ...
      'String',classes);

   % == Edit lines =======================================================

   % x-axis
   bottom=bottom-1.2*height;
   htxxaxis=uicontrol( ...
      'Style','text', ...
      'Units','normalized', ...
      'Position',[left bottom width 0.9*height], ...
      'String','X-Axis');
   bottom=bottom-height;
   hedxaxis = uicontrol(...
    'Units','normalized', ...
      'ListboxTop',0, ...
        'Position',[left bottom width height], ...
      'CallBack','createdata(''setaxis'',gcf)',...
      'Style','edit',...
      'String','[-1 1]');

   % y-axis
   bottom=bottom-1.2*height;
   htxyaxis=uicontrol( ...
      'Style','text', ...
      'Units','normalized', ...
      'Position',[left bottom width 0.9*height], ...
      'String','Y-Axis');
   bottom=bottom-height;
   hedyaxis = uicontrol(...
    'Units','normalized', ...
      'ListboxTop',0, ...
      'Position',[left bottom width height], ...
      'CallBack','createdata(''setaxis'',gcf)',...
      'Style','edit',...
      'String','[-1 1]');

   % normal distributions are given by SIGMA in addition
   if strcmpi(varargin{1},'gauss'),

      % label
      bottom=bottom-1.5*height;
      htxcov=uicontrol( ...
         'Style','text', ...
         'Units','normalized', ...
         'Position',[left bottom width 0.9*height], ...
         'String','Covariance');

      % cov(xy)
      bottom=bottom-height;
      hedxx = uicontrol(...
        'Units','normalized', ...
         'ListboxTop',0, ...
         'Position',[left bottom width*0.5 height], ...
         'CallBack','createdata(''setcov'',gcf,1)',...
         'Style','edit',...
         'String','1');
      % cov(xy)
      hedxy = uicontrol(...
        'Units','normalized', ...
         'ListboxTop',0, ...
         'Position',[left+width*0.5 bottom width*0.5 height], ...
         'CallBack','createdata(''setcov'',gcf,2)',...
         'Style','edit',...
         'String','0');
      % cov(yx)
      bottom=bottom-height;
      hedyx = uicontrol(...
        'Units','normalized', ...
         'ListboxTop',0, ...
         'Position',[left bottom width*0.5 height], ...
         'CallBack','createdata(''setcov'',gcf,3)',...
         'Style','edit',...
         'String','0');
      % cov(yy)
      hedyy = uicontrol(...
        'Units','normalized', ...
         'ListboxTop',0, ...
         'Position',[left+width*0.5 bottom width*0.5 height], ...
         'CallBack','createdata(''setcov'',gcf,4)',...
         'Style','edit',...
         'String','1');

      bottom=bottom-1.2*height;
      htxmi1=uicontrol( ...
         'Style','text', ...
         'Units','normalized', ...
         'Position',[left bottom width 0.9*height], ...
         'String','MI=[');
      bottom=bottom-0.9*height;
      htxmi2=uicontrol( ...
         'Style','text', ...
         'Units','normalized', ...
         'Position',[left bottom width 0.9*height], ...
         'String','    ]');
   end

   % == Axes title ========================================================
   pos=get(haxes1,'Position');
   titletext=sprintf('File: %s',file.name);
   fontsize=(1-pos(2)-pos(4))*0.8;
   htitle=title(titletext,...
      'VerticalAlignment','bottom',...
      'HorizontalAlignment','left',...
      'FontUnits','normalized',...
      'Units','normalized',...
      'Position',[0 1 0],...
      'FontSize',fontsize);


   % =========================================================================

   % create the structures according to the current set type
   switch lower(varargin{1}),
   case 'finite'
      set(hfigure,'name','Generator of finite point sets');
      ident=ID_FINITE;
      % set handlers
      handlers=struct(...
         'settype',lower(varargin{1}),...
         'saved',1,...
         'btsave',hbtsave,...
         'edxaxis',hedxaxis,...
         'edyaxis',hedyaxis,...
         'title',htitle,...
         'btok',hbtok,...
         'axes1',haxes1,...
         'puclass',hpuclass );
   case 'gauss'
      set(hfigure,'name','Generator of Gaussian distributions');
      ident=ID_NORMAL;
      % set handlers
      handlers=struct(...
         'settype',lower(varargin{1}),...
         'currpoint',0,...
         'currhandle',0,...
         'saved',1,...
         'title',htitle,...
         'btsave',hbtsave,...
         'edxaxis',hedxaxis,...
         'edyaxis',hedyaxis,...
         'txmi1',htxmi1,...
         'txmi2',htxmi2,...
         'edxx',hedxx,...
         'edxy',hedxy,...
         'edyx',hedyx,...
         'edyy',hedyy,...
         'btok',hbtok,...
         'axes1',haxes1,...
         'puclass',hpuclass );
   end

   sets=struct(...
      'K',zeros(1,K),...
      'X',[],...
      'I',[],...
      'MI',[],...
      'SIGMA',[],...
      'N',2,...
      'id',ident);

   % store handlers and data set structure
   set(hfigure,'UserData',handlers);
   set(haxes1,'UserData',sets);


   % set figure as visible
   set(hfigure,'Visible','on');


case 'setcov'
   % == Set covariance matrix of current selected point ===================

   % get handlers
   hfigure=varargin{1};
   h=get(hfigure,'UserData');

   %get data set
   sets=get(h.axes1,'UserData');

   % current point
   i=h.currpoint;

   if varargin{2}==2,
      set(h.edyx,'String',get(h.edxy,'String'));
   elseif varargin{2}==3,
      set(h.edxy,'String',get(h.edyx,'String'));
   end

   % if some point is selected
   if i ~= 0,
      % get cov. matrix from edit lines
      sigma(1,1)=str2num(get(h.edxx,'String'));
      sigma(1,2)=str2num(get(h.edxy,'String'));
      sigma(2,1)=str2num(get(h.edyx,'String'));
      sigma(2,2)=str2num(get(h.edyy,'String'));

      % is sigma positive definite ?
      [aa,p]=chol(sigma);
      if p ~= 0,
         set(h.edxx,'String','1');
         set(h.edxy,'String','0');
         set(h.edyx,'String','0');
         set(h.edyy,'String','1');
         sigma=eye(2,2);
      end

      sets.SIGMA(:,(i-1)*2+1:i*2)=sigma;
      set(h.axes1,'UserData',sets);

%%%      window=axis;
      window=getaxis(h.axes1);
      R=min([(window(2)-window(1)),(window(4)-window(3))])/20;
      i=h.currpoint;
      class=sets.I(i);
%%      isigma=inv(sigma);
      mi=sets.MI(:,i);
%%%      [x,y]=ellipse(isigma,20,R,mi);
      [x,y]=ellips(mi,inv(sigma),R);

      if h.currhandle==0,
         % draw new ellipse
         h.currhandle =fill(x,y,XCOLORS(mod(class-1,MAXCOLOR)+1),...
            'EraseMode','none',...
            'ButtonDownFcn','createdata(''click'',gcf)',...
            'Tag','ellipse',...
            'UserData',mi);
         set(hfigure,'UserData',h);
      else
         set(h.currhandle,'XData',x,'YData',y,'EraseMode','normal');
      end
   end % if i ~= 0,

case 'redraw'
   % == Redraw axes ===========================================================
   hfigure=varargin{1};
   h = get(hfigure,'UserData');      % get handlers

   children=get(h.axes1,'Children' );
   set(children,'EraseMode','normal','Visible','off');

   % get sets
   sets=get(h.axes1,'UserData');

   % set axes
   if strcmpi(sets.id,ID_FINITE)==1,
      maxs=max(sets.X');
      mins=min(sets.X');
   elseif strcmpi(sets.id,ID_NORMAL )==1,
      % set axes
      maxs=max(sets.MI');
      mins=min(sets.MI');
   end
   dx=min( (maxs(1)-mins(1)), 1 )*DX_SPACE;
   dy=min( (maxs(2)-mins(2)), 1 )*DY_SPACE;
   x1=round(mins(1)-dx);
   x2=round(maxs(1)+dx);
   y1=round(mins(2)-dy);
   y2=round(maxs(2)+dx);
   win=[x1 x2 y1 y2];
   axes(h.axes1);
   %%%   axis(win);
   setaxis(h.axes1,win);

   % redraw points or ellipses
   if strcmpi(sets.id,ID_FINITE)==1,
      % points
      for i=1:sum(sets.K),
         line(sets.X(1,i),sets.X(2,i), ...
            'LineStyle','none', ...
            'Marker','.', ...
            'Color',XCOLORS(mod(sets.I(i)-1,MAXCOLOR)+1), ...
            'MarkerSize',25, ...
            'ButtonDownFcn','createdata(''click'',gcf)',...
            'EraseMode','none',...
            'Tag','point');
      end

   elseif strcmpi(sets.id,ID_NORMAL )==1,
      R=min([(win(2)-win(1)),(win(4)-win(3))])/20;
      % ellipses
      for i=1:sum(sets.K),
         sigma=sets.SIGMA(:,(i-1)*2+1:i*2);
         mi=sets.MI(:,i);
%%         [x,y]=ellipse(isigma,20,R,mi);
         [x,y]=ellips(mi,inv(sigma),R);
         class=sets.I(i);

         fill(x,y,XCOLORS(mod(class-1,MAXCOLOR)+1),...
            'EraseMode','none',...
            'ButtonDownFcn','createdata(''click'',gcf)',...
            'Tag','ellipse',...
            'UserData',mi);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -