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

📄 createdata.m

📁 具有图形操作界面的支持向量机多类分类实验系统.全部用Matlab实现,可以实现多种分类识别. 这是本人的毕业设计的附属程序
💻 M
📖 第 1 页 / 共 2 页
字号:
            '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;
      %椭圆
      for i=1:sum(sets.K),
         sigma=sets.SIGMA(:,(i-1)*2+1:i*2);
         mi=sets.MI(:,i);
         [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);
      end
   end 

   %定义新的值
   set(h.edxaxis,'String',sprintf('[%s]',num2str(win(1:2))) );
   set(h.edyaxis,'String',sprintf('[%s]',num2str(win(3:4))) );

   for i=1:max(size(sets.K)),
      txnum=sprintf(' %d ',i);
      classes(i,1:size(txnum,2))=txnum;
   end
   set(h.puclass,'String',classes);


case 'setaxis'

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

   xaxis=str2num(get(h.edxaxis,'String'));
   yaxis=str2num(get(h.edyaxis,'String'));

   if size(xaxis) ~= [1 2] | xaxis(2) <= xaxis(1),
      errordlg('Bad X-Axis limits.','Error','modal');
   elseif size(yaxis) ~= [1 2] | yaxis(2) <= yaxis(1),
      errordlg('Bad Y-Axis limits.','Error','modal');
   else
      setaxis(h.axes1,[xaxis yaxis]);
   end



case 'click'
   hfigure=varargin{1};
   h=get(hfigure,'Userdata');

   pointer=get(h.axes1,'CurrentPoint');

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

   hobject=gco;

   clicktype = lower(get(hfigure,'SelectionType'));
   switch clicktype

   case 'normal'
    
      if ~strcmpi(get(hobject,'Tag'),'point') & ~strcmpi(get(hobject,'Tag'),'ellipse'),

         h.saved=0;
         set(hfigure,'UserData',h);

         class=get(h.puclass,'Value');

         sets.K(class)=sets.K(class)+1;
         sets.I(sum(sets.K))=class;

         switch h.settype
         case 'finite'
            sets.X=[sets.X,[pointer(1,1);pointer(1,2)]];
            line(pointer(1,1),pointer(1,2), ...
               'LineStyle','none', ...
               'Marker','.', ...
               'Color',XCOLORS(mod(class-1,MAXCOLOR)+1), ...
               'MarkerSize',25, ...
               'ButtonDownFcn','createdata(''click'',gcf)',...
               'EraseMode','none',...
               'Tag','point');
            % 保存数据集
            set(h.axes1,'UserData',sets);
         case 'gauss'
            sets.MI=[sets.MI,[pointer(1,1);pointer(1,2)]];
            sets.SIGMA=[sets.SIGMA,eye(2,2)];
            set(h.txmi1,'String',sprintf('MI=[%.2f',pointer(1,1)));
            set(h.txmi2,'String',sprintf('    %.2f]',pointer(1,2)));

            % set cov matrix and draw ellipse
            h.currpoint=size(sets.MI,2);
            h.currhandle=0;
            set(hfigure,'UserData',h);
            set(h.axes1,'UserData',sets);
            createdata('setcov',hfigure,0);
         end

      end 

   case 'open'
      if strcmpi(h.settype,'gauss')==1 & strcmpi(get(hobject,'Tag'),'ellipse'),

         % 设置选择的点为当前的点
         pixelpos=get(hobject,'UserData');
         K=sum(sets.K);
         for i=1:K,
            if pixelpos==sets.MI(:,i),
               h.currpoint=i;
               h.currhandle=hobject;
               sigma=sets.SIGMA(:,(i-1)*2+1:i*2);
               mi=sets.MI(:,i);

               set(h.txmi1,'String',sprintf('MI=[%.2f',mi(1)));
               set(h.txmi2,'String',sprintf('    %.2f]',mi(2)));

               set(h.edxx,'String',sigma(1,1));
               set(h.edxy,'String',sigma(1,2));
               set(h.edyx,'String',sigma(2,1));
               set(h.edyy,'String',sigma(2,2));
               set(hfigure,'UserData',h);
               break;
            end
         end

      end 

   case 'alt'

      if strcmpi(get(hobject,'tag'),'point')==1,

         pixelpos=[get(hobject,'XData');get(hobject,'YData')];

         K=sum(sets.K);
         for i=1:K,
            pos=sets.X(:,i);

            if pixelpos==pos,
                   % 更新数据集
               sets.K(sets.I(i))=sets.K(sets.I(i))-1;
               sets.I=[sets.I(:,1:i-1),sets.I(:,i+1:K)];
               sets.X=[sets.X(:,1:i-1),sets.X(:,i+1:K)];
               set(h.axes1,'UserData',sets);

               %消除点集
               set(hobject,'EraseMode','normal');
               delete(hobject);

               h.saved=0;
               set(hfigure,'UserData',h);

               break;
            end 
         end

      elseif strcmpi(get(hobject,'tag'),'ellipse')==1,

         pixelpos=get(hobject,'UserData');

         K=sum(sets.K);
         for i=1:K,
            pos=sets.MI(:,i);

            if pixelpos==pos,
               sets.K(sets.I(i))=sets.K(sets.I(i))-1;
               sets.I=[sets.I(:,1:i-1),sets.I(:,i+1:K)];
               sets.MI=[sets.MI(:,1:i-1),sets.MI(:,i+1:K)];
               sets.SIGMA=[sets.SIGMA(:,1:(i-1)*2),sets.SIGMA(:,i*2+1:K*2)];
               h.currpoint=0;
               h.currhandle=0;

               set(h.axes1,'UserData',sets);

               set(hobject,'EraseMode','normal');
               delete(hobject);

               h.saved=0;
               set(hfigure,'UserData',h);

               break;
            end 
         end 
      end 

   end 

case 'load'
   % 装载数据并在坐标轴上显示
   hfigure=varargin{1};
   h=get(hfigure,'UserData');

   % 获取结构数据集
   sets=get(h.axes1,'UserData');

   loadit=1;

   if h.saved==0,
      answer=questdlg(...
         '数据已经改变,要继续装载数据吗?',...
         '警告',...
         '确定','取消','Cancel');

      if answer==0 | strcmpi(answer,'取消'),
         loadit=0;
      end
   end

   if loadit==1,
      [name,path]=uigetfile('*.mat','装载数据');

      if name ~= 0,
         pathname=strcat(path,name);
         if strcmpi(sets.id, ID_FINITE), a = check2ddata(pathname); end
         if strcmpi(sets.id, ID_NORMAL), a = check2dgauss(pathname); end
           
         if a,

            % 保存路径
            file.name=name;
            file.path=path;
            file.pathname=pathname;
            set(h.btsave,'UserData',file);

            oldID=sets.id;
            % 装载数据并保存
            sets=load(file.pathname);
            
            sets.id = oldID;
            sets.I = sets.y;
            sets.N=2;
            for ii=1:max(sets.I),
              sets.K(ii)=length(find(sets.I==ii));
            end
            if strcmpi(sets.id, ID_NORMAL),
              sets.MI = sets.Mean;
              sets.SIGMA=[];
              for ii=1:size(sets.Mean,2),
                sets.SIGMA=[sets.SIGMA, sets.Cov(:,:,ii)];
              end
            end
            
            set(h.axes1,'UserData',sets);

            h.currpoint=0;
            h.currhandle=0;
            h.saved=1;
            set(hfigure,'UserData',h);

            createdata('redraw',hfigure);

            titletext=sprintf('文件: %s',file.name);
            set(h.title,'String',titletext);

         else
            errordlg('此文件夹没有包含所需要的数据.','文件错误','modal');
         end
      end 
   end 


case 'save'
  
   hfigure=varargin{1};
   h=get(hfigure,'UserData');

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

   if sum(sets.K)~=0,
      file=get(h.btsave,'UserData');                       %获取当前文件名
      [name,path]=uiputfile(file.pathname,'保存');    %调用保存窗口

      if name ~= 0,
         file.name=name;
         file.path=path;
         file.pathname=strcat(path,name);
         set(h.btsave,'UserData',file);

         titletext=sprintf('文件: %s',file.name);
         set(h.title,'String',titletext);

         ssets=sets;
         KL=size(sets.K,2);
         NK=sum(sets.K);

         id=sets.id;
         I=sets.I;
         K=sets.K;
         N=sets.N;
         
         i=1;
         while i <= KL,
            if K(i)==0,
               for j=1:NK,
                  if I(j) > i,
                     I(j)=I(j)-1;
                  end
               end

               K=[K(1:i-1),K(i+1:KL)];
               KL=KL-1;
            else
               i=i+1;
            end
         end

         switch h.settype
         case 'finite'
            X=sets.X;
            y=I;
            save(file.pathname,'X','y');
         case 'gauss'
            Mean=sets.MI;
            y=I;
            for jj=1:size(Mean,2),
              Cov(:,:,jj)=sets.SIGMA(:,(jj-1)*2+1:jj*2);
            end
            save(file.pathname,'Mean','Cov','y');
         end

         h.saved=1;
         set(hfigure,'UserData',h);
      end 
   end 

case 'ok'
   hfigure=varargin{1};
   h=get(hfigure,'UserData');
   
   closeit=1;

   if h.saved==0,
      answer=questdlg(...
         '数据已经被改变,你想保存该数据吗?',...
         '警告',...
         '是','否','取消','Cancel');

      if answer ~= 0,
         switch lower(answer)
         case '是'
            createdata('save',hfigure);
            h=get(hfigure,'UserData');
            closeit=h.saved;
         case '取消'
            closeit=0;
         case '否'
            close(hfigure,hfigure);
            return;
         end

      else
         closeit=0;
      end 
   end 

   if closeit==1,                      
      sets=get(h.axes1,'UserData');
      command=get(h.btok,'UserData');
      file=get(h.btsave,'UserData');

      if sum(sets.K)~=0 & size(command,2) > 2,
         feval(command{3},command{4:size(command,2)},file.path,file.name);
      end

      close(hfigure);
   end

   case 'close'
   hfigure=varargin{1};
   h=get(hfigure,'UserData');

   closeit=1;

   if h.saved==0,
      answer=questdlg(...
         '数据已经被改变,你想退出吗?',...
         '警告',...
         '是','否','Cancel');

      if answer == 0 | strcmpi(answer,'否')==1,
         closeit=0;
      end
   end

   if closeit==1,
      close(hfigure);
   end

case 'info'
   % 直接调用Matlab帮助浏览
   helpwin(mfilename);

end

return;

function [rect]=getaxis(handle)                                                
% function [rect]=getaxis(handle)                                               
%                                                                               
% GETAXIS returns a row vector containing the scaling for                       
%   the plot with a given handle.                                               
%                                                                               
% See also AXIS.                                                                
%                                                                               
                                                                                
rect=[get(handle,'XLim'),get(handle,'YLim'),get(handle,'ZLim')];                
                                                                                
return; 


function []=setaxis(handle,rect)                                                
% function []=setaxis(handle,rect)                                              
%                                                                               
% SETAXIS sets scaling for the x- and y-axes                                    
%   on the plot with a given handle.                                            
%                                                                               
% See also AXIS.                                                                
%                                                                               
                                                                                
set(handle,'XLim',rect(1:2));                                                   
set(handle,'YLim',rect(3:4));                                                   
                                                                                
if size(rect,2)>=6,                                                             
   set(handle,'ZLim',rect(5:6));                                                
end                                                                             
                                                                                
return;      

⌨️ 快捷键说明

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