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

📄 nnd3pc.m

📁 Martin T.Hagan等著,戴葵等译,神经网络设计,机械工业出版社,一书的所有例程
💻 M
📖 第 1 页 / 共 2 页
字号:
function nnd3pc(cmd,arg1,arg2,arg3)
%NND3PC Perceptron classification demonstration.
%
%	This demonstration requires either the MININNET functions
%	on the NND disk or the Neural Network Toolbox.

% First Version, 8-31-95.

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

% CONSTANTS
me = 'nnd3pc';
Fs = 8192;

% DEFAULTS
if nargin == 0, cmd = ''; else cmd = lower(cmd); end

% FIND WINDOW IF IT EXISTS
fig = nnfgflag(me);
if length(get(fig,'children')) == 0, fig = 0; end

% GET WINDOW DATA IF IT EXISTS
if fig
  H = get(fig,'userdata');
  fig_axis = H(1);         % window axis
  desc_text = H(2);        % handle to first line of text sequence
  lines = H(3:4);          % handles to red lines in conveyor ends
  indicators = H(5:7);     % fruit, orange & apple indicators
  sounds = H(8:14);        % pointers to sounds
  nnet = H(15:17);         % handles to box & text of neural network
  p_text = H(18:20);       % handles to three input displays
  angle_ptr = H(21);       % angle (deg) of lines in conveyer ends
  fruit_ptr = H(22);       % pointer to fruit shape
  id_ptr = H(23);          % pointer to fruit type (1-orange 2-apple)
  net_ptr = H(24);         % pointer to network specific data
  p_ptr = H(25);           % pointer to input vector
  arrows = H(26:27);       % handles to arrows
end

%==================================================================
% Activate the window.
%
% ME() or ME('')
%==================================================================

if strcmp(cmd,'')
  if fig
    figure(fig)
    set(fig,'visible','on')
  else
    feval(me,'init')
  end

%==================================================================
% Close the window.
%
% ME() or ME('')
%==================================================================

elseif strcmp(cmd,'close') & (fig)
  delete(fig)

%==================================================================
% Initialize the window.
%
% ME('init')
%==================================================================

elseif strcmp(cmd,'init') & (~fig)

  % CHECK FOR TRANSFER FUNCTIONS
  if ~nnfexist(me), return, end

  % NEW DEMO FIGURE
  fig = nndemof2(me,'DESIGN','Perceptron Classification','','Chapter 3');

  set(fig, ...
    'windowbuttondownfcn',nncallbk(me,'down'), ...
    'BackingStore','off',...
    'nextplot','add');
  H = get(fig,'userdata');
  fig_axis = H(1);
  desc_text = H(2);

  % SOUND POINTERS
  wind = uicontrol('visible','off','userdata',nndsnd(3));
  knock = uicontrol('visible','off','userdata',nndsnd(5));
  scan = uicontrol('visible','off','userdata',nndsnd(1));
  classify = uicontrol('visible','off','userdata',nndsnd(4));
  blip = uicontrol('visible','off','userdata',nndsnd(6));
  bloop = uicontrol('visible','off','userdata',nndsnd(7));
  blp = uicontrol('visible','off','userdata',nndsnd(9));

  % ICON
  nndicon(3,458,363,'shadow')

  % CONVEYER BELT
  deg = pi/180;
  angle = [0:5:360]*deg;
  cx = cos(angle);
  cy = sin(angle);

  % ENTRANCE BOX
  x = 60;
  y = 20;
  fill([0 0 x+10 x+10],y+[70 50 50 70],nndkblue,...
    'edgecolor','none')
  fill(x+[10 10 50 50],y+[80 40 40 80],nndkblue,...
    'edgecolor','none')
  plot([0 x+[10 10 50 50 10 10] 0],...
    y+[50 50 40 40 80 80 70 70],...
    'color',nnred)
  left_arrow = fill(x+30+[-5 -5 -10 0 10 5 5],y+60+[15 5 5 -15 5 5 15],nndkblue,...
    'edgecolor',nnred,...
    'erasemode','none');
  fruit_ind = text(x-25,y+60,'Fruit',...
    'color',[0.8 0.8 0],...
    'fontweight','bold',...
    'horiz','center',...
    'erasemode','none');

  % LEFT CIRCLE
  line_angle = 45*deg;
  fill(x-10+cx*10,y+10+cy*10,nnred,...
    'edgecolor',nndkblue,...
    'linewidth',2)
  line_1 = plot(x-10+cos([0 pi]+line_angle)*8,y+10+sin([0 pi]+line_angle)*8,...
    'color',nndkblue,...
    'erasemode','none',...
    'linewidth',2);

  % RIGHT CIRCLE
  x = 320;
  fill(x+10+cx*10,y+10+cy*10,nnred,...
    'edgecolor',nndkblue,...
    'linewidth',2)
  line_2 = plot(x+10+cos([0 pi]+line_angle)*8,y+10+sin([0 pi]+line_angle)*8,...
    'color',nndkblue,...
    'erasemode','none',...
    'linewidth',2);

  % BELT
  plot([50 330],[y y]+20,...
    'color',nndkblue,...
    'linewidth',2)
  plot([50 330],[y y],...
    'color',nndkblue,...
    'linewidth',2)

  % SENSOR BOX
  x = 130;
  plot(x+[10 10 60 NaN 0 0 60 NaN -10 -10 60],...
    y+[90 70 70 NaN 90 60 60 NaN 90 50 50],...
    'color',nndkblue,...
    'linewidth',2)
  fill(x+[0 40 20],y+[40 40 80],nndkblue,...
    'edgecolor',nnred)
  fill(x+[0 40 40 0],y+[14 14 8 8],nndkblue,...
    'edgecolor',nnred)
  fill([0 0 380 380],y+[90 110 110 90],nndkblue,...
    'edgecolor','none')
  p1_text = text(20,y+100,'SHAPE: ?',...
    'color',nnltgray,...
    'fontweight','bold',...
    'horiz','left',...
    'erasemode','none');
  p2_text = text(190,y+100,'TEXTURE: ?',...
    'color',nnltgray,...
    'fontweight','bold',...
    'horiz','center',...
    'erasemode','none');
  p3_text = text(360,y+100,'WEIGHT: ?',...
    'color',nnltgray,...
    'fontweight','bold',...
    'horiz','right',...
    'erasemode','none');

  % NEURAL NETWORK
  x = 190;
  plot(x+[60 80],y+[60 60],...
    'color',nndkblue,...
    'linewidth',2)
  nn_box = fill(x+[5 0 0 5 55 60 60 55],y+[80 75 45 40 40 45 75 80],nndkblue,...
    'edgecolor',nnred,...
    'erasemode','none');
  nn_text1 = text(x+30,y+68,'Neural',...
    'color',[0 0.8 0],...
    'fontweight','bold',...
    'horiz','center',...
    'erasemode','none');
  nn_text2 = text(x+30,y+52,'Network',...
    'color',[0 0.8 0],...
    'fontweight','bold',...
    'horiz','center',...
    'erasemode','none');

  % EXIT BOX
  x = 320;
  fill([x-10 x-10 380 380],y+[80 62 62 80],nndkblue,...
    'edgecolor','none')
  fill([x-10 x-10 380 380],y+[40 58 58 40],nndkblue,...
    'edgecolor','none')
  fill(x-[10 10 50 50],y+[80 40 40 80],nndkblue,...
    'edgecolor','none')
  plot([378 x-[50 50] 378],y+[80 80 40 40],...
    'color',nnred)
  plot([378 x-[10 10] 378],y+[62 62 58 58],...
    'color',nnred)
  right_arrow = fill(x-30+[-5 -5 -10 0 10 5 5],y+60-[15 5 5 -15 5 5 15],nndkblue,...
    'edgecolor',nnred,...
    'erasemode','none');
  orange_ind = text(x+25,y+72,'Oranges',...
    'color',[1 0.5 0],...
    'fontweight','bold',...
    'horiz','center',...
    'erasemode','none');
  apple_ind = text(x+25,y+50,'Apples',...
    'color',[1 0 0],...
    'fontweight','bold',...
    'horiz','center',...
    'erasemode','none');

  % BUTTONS
  drawnow % Let everything else appear before buttons
  uicontrol(...
    'units','points',...
    'position',[400 180 60 20],...
    'string','Go',...
    'callback',[me '(''fruit'')'])
  uicontrol(...
    'units','points',...
    'position',[400 145 60 20],...
    'string','Clear',...
    'callback',[me '(''remove'')'])
  uicontrol(...
    'units','points',...
    'position',[400 110 60 20],...
    'string','Contents',...
    'callback','nndtoc')
  uicontrol(...
    'units','points',...
    'position',[400 75 60 20],...
    'string','Close',...
    'callback',[me '(''close'')'])

  % SAVE WINDOW DATA AND LOCK
  angle_ptr = uicontrol('visible','off','userdata',line_angle);
  fruit_ptr = uicontrol('visible','off','userdata',[]);
  id_ptr = uicontrol('visible','off','userdata',[]);
  net_ptr = uicontrol('visible','off','userdata',[]);
  p_ptr = uicontrol('visible','off','userdata',[]);

  H = [fig_axis, ...
       desc_text, ...
       line_1 line_2, ...
       fruit_ind orange_ind apple_ind, ...
       wind knock scan classify blip bloop blp, ...
       nn_box nn_text1 nn_text2, ...
       p1_text p2_text p3_text, ...
       angle_ptr fruit_ptr id_ptr net_ptr p_ptr, ...
       left_arrow right_arrow];

  set(fig,'userdata',H,'nextplot','new')

  % INSTRUCTION TEXT
  feval(me,'instr');

  % SETUP NETWORK SPECIFIC STUFF
  feval(me,'setup')

  % LOCK WINDOW
  set(fig,...
   'nextplot','new',...
   'color',nnltgray);

  nnchkfs;

%==================================================================
% Display the instructions.
%
% ME('instr')
%==================================================================

elseif strcmp(cmd,'instr') & (fig)
  nnsettxt(desc_text,...
    'Click [Go] to send a',...
    'fruit down the belt',...
    'to be classified by a',...
    'perceptron network.',...
    '',...
    'The calculations for',...
    'the perceptron will',...
    'appear to the left.')
    
%==================================================================
% Respond to fruit.
%
% ME('fruit')
%==================================================================

elseif strcmp(cmd,'fruit') & (fig) & (nargin == 1)

  % GET DATA
  wind = get(sounds(1),'userdata');
  knock = get(sounds(2),'userdata');
  scan = get(sounds(3),'userdata');
  classify = get(sounds(4),'userdata');
  blip = get(sounds(5),'userdata');
  bloop = get(sounds(6),'userdata');
  blp = get(sounds(7),'userdata');
  angle = get(angle_ptr,'userdata');
  fruit = get(fruit_ptr,'userdata');
  fruit_id = get(id_ptr,'userdata');
  axes(fig_axis);

  % GET RID OF PREVIOUS FRUIT
  if length(fruit) > 0

    % CLEAR VALUES
    set(p_text,...
      'color',nndkblue)
    set(p_text(1),...
      'string','SHAPE: ?',...
      'color',nnltgray)
    set(p_text(2),...
      'string','TEXTURE: ?',...
      'color',nnltgray)
    set(p_text(3),...
      'string','WEIGHT: ?',...
      'color',nnltgray)

    % CLEAR NETWORK DEPENDENT STUFF
    feval(me,'clear')

    nnpause(0.5)
    end

  % NEW FRUIT
  pause(1)
  x = 82;
  y = 42;

  % FRUIT ID, COLOR & SHAPE
  if (rand > 0.5)
    % ORANGE
    fruit_id = 1;
    fruit_x = [5 0 0 5 10 15 15 10];
    fruit_y = [15 10 5 0 0 5 10 15];
    fruit_c = [1 0.5 0];
    p = [1; -1; -1];
  else
    % APPLE
    fruit_id = 2;
    fruit_x = [7.5 5 0 0 5 7.5 10 15 15 10];
    fruit_y = [13 15 10 5 0 2 0 5 10 15];
    fruit_c = [1 0 0];
    p = [1; 1; -1];
  end
  p = p*0.6 + (rands(3,1) .^ 2) * 0.4;
  p = round(p*100)/100;
  set(p_ptr,'userdata',p);

  % FLASH FRUIT INDICATOR TWICE
  set(fig,'nextplot','add')
  nnsound(blip,Fs);
  set(indicators(1),...
    'color',[1 1 1])
  box = plot([10 60 60 10 10],[72 72 88 88 72],...
    'color',[1 1 1],...
    'erasemode','none');

  nnpause(0.25)
  nnsound(bloop,Fs);
  set(indicators(1),...
    'color',[0.8 0.8 0])
  set(box,...
    'color',[0.8 0.8 0])

  nnpause(0.25)
  nnsound(blip,Fs);
  set(indicators(1),...
    'color',[1 1 1])
  set(box,...
    'color',[1 1 1])

  nnpause(0.25)
  nnsound(bloop,Fs);
  set(indicators(1),...
    'color',[0.8 0.8 0])
  set(box,...
    'color',nndkblue)
  delete(box)
  nnpause(0.25)

  set(arrows(1),...
    'facecolor',nnred)
  t1 = clock;
  nnsound(wind,Fs);
  while etime(clock,t1) < 0.5, end
  nnpause(0.25)
  set(arrows(1),...
    'facecolor',nndkblue)

  set(indicators(1),...
    'color',[0.8 0.8 0])

  % CREATE FRUIT
  fruit = fill(x+fruit_x,y+fruit_y,fruit_c,...
    'edgecolor',fruit_c*0.5,...
    'erasemode','none');
  set(fig,'nextplot','new')
  nnsound(knock,Fs);
  nnpause(0.25)

  % MOVE FRUIT TO SENSOR
  deg = pi/180;
  for dx=10:10:60
    t1 = clock;
    nnsound(blp,Fs);
    while etime(clock,t1) < 0.05, end
    set(fruit,...
      'facecolor',nnltgray,...
      'edgecolor',nnltgray);
    set(fruit,...
      'facecolor',fruit_c,...
      'edgecolor',fruit_c*0.5,...
      'xdata',fruit_x + x + dx)
    angle = angle + 20;
    adata = [0 pi]-angle*deg;
    xdata = cos(adata)*8;
    ydata = sin(adata)*8+30;
    set(lines,'color',nnred);
    set(lines(1),...
      'xdata',xdata+50,...
      'ydata',ydata,...
      'color',nndkblue)
    set(lines(2),...
      'xdata',xdata+330,...
      'ydata',ydata,...
      'color',nndkblue)
  end

⌨️ 快捷键说明

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