📄 createdata.m
字号:
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], ...
'FontSize',10,...
'String','关闭');
% ok button
bottom=bottom+1*height;
hbtok = uicontrol( ...
'Units','Normalized', ...
'Callback','createdata(''ok'',gcf)',...
'ListboxTop',0, ...
'UserData',varargin,...
'Position',[left bottom width height], ...
'FontSize',10,...
'String','OK');
% info button
bottom=bottom+1.5*height;
hbtinfo = uicontrol( ...
'Units','Normalized', ...
'Callback','createdata(''info'',gcf)',...
'ListboxTop',0, ...
'Position',[left bottom width height], ...
'FontSize',10,...
'String','帮助');
% load button
bottom=bottom+1.5*height;
hbtload = uicontrol( ...
'Units','Normalized', ...
'Callback','createdata(''load'',gcf)',...
'ListboxTop',0, ...
'Position',[left bottom width height], ...
'FontSize',10,...
'String','装载');
% 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,...
'FontSize',10,...
'String','保存');
% == 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',...
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -