📄 creatset.m
字号:
function result = creatset(action,varargin)
% CREATSET interactive data sets generator.
%
% Generator is fully controled by mouse. The mouse buttons have
% the following functions:
% --------------------------------------------------------
% Left button - creates a new point or distribution
% Right button - erases the point or distribution
%
% If normal distributed mixture is created then
% double-click on the left button gets info, moreover makes distribution
% selected - change of a covarianace matrix is then possible.
% --------------------------------------------------------------------
%
% Syntax
% creatset('finite')
% creatset('normal')
% creatset('...',K)
% creatset('...',K,'fce',arg1,arg2,..)
%
% Statistical Pattern Recognition Toolbox, Vojtech Franc, Vaclav Hlavac
% (c) Czech Technical University Prague, http://cmp.felk.cvut.cz
% Written Vojtech Franc (diploma thesis) 04.11.1999
% Modifications
% 24. 6.00 V. Hlavac, comments polished.
XCOLORS=['b','r','g','y','m','k','c']; % 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
creatset('initialize',action,K,varargin{2:nargin-1});
case 'normal'
% == We will create normal distributed sets ===========================
if nargin < 2,
K=2;
else
K=varargin{1};
end
creatset('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','creatset(''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','creatset(''close'',gcf)',...
'ListboxTop',0, ...
'Position',[left bottom width height], ...
'String','Close');
% ok button
bottom=bottom+1*height;
hbtok = uicontrol( ...
'Units','Normalized', ...
'Callback','creatset(''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','creatset(''info'',gcf)',...
'ListboxTop',0, ...
'Position',[left bottom width height], ...
'String','Info');
% load button
bottom=bottom+1.5*height;
hbtload = uicontrol( ...
'Units','Normalized', ...
'Callback','creatset(''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','creatset(''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','creatset(''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','creatset(''setaxis'',gcf)',...
'Style','edit',...
'String','[-1 1]');
% normal distributions are given by SIGMA in addition
if strcmpi(varargin{1},'normal'),
% 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','creatset(''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','creatset(''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','creatset(''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','creatset(''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','Finite data set generator');
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 'normal'
set(hfigure,'name','Normal distribution generator');
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,sigma,R);
if h.currhandle==0,
% draw new ellipse
h.currhandle =fill(x,y,XCOLORS(mod(class-1,MAXCOLOR)+1),...
'EraseMode','none',...
'ButtonDownFcn','creatset(''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','creatset(''click'',gcf)',...
'EraseMode','none',...
'Tag','point');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -