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

📄 som_find_neigb.m

📁 this file is leverage algorithm written in matlab as m-file and tested in matlab.so anyone can ue th
💻 M
字号:
function list_of_neurons = som_find_neigb(winner,r,bound,nsize)

% som_find_neigb looks for the neurons to be updated
%
% list_of_neurons = som_find_neigb(winner,r,bound,nsize);
%
% input:
%   winner      winner neuron
%   r           ring of neuron to be updated
%   bound       type of bound ('toroidal' or 'normal')
%   nsize       net size
% 
% output:
%   list_of_neurons     list of neurons to be updated
%
% see the HTML HELP files (help.htm) for details 

% check position
on_col = mod(winner -1,nsize) + 1;
on_row = ceil(winner/nsize);

list_of_neurons = [];
% up
cent_point_in_row = winner - nsize*r;
add_up = [cent_point_in_row - r:cent_point_in_row + r];

% down
cent_point_in_row = winner + nsize*r;
add_down = [cent_point_in_row - r:cent_point_in_row + r];

% left
cent_point_in_col = winner - r;
add_left = [cent_point_in_col - r*nsize:nsize:cent_point_in_col + r*nsize];

% right
cent_point_in_col = winner + r;
add_right = [cent_point_in_col - r*nsize:nsize:cent_point_in_col + r*nsize];

if bound == 1  % toroidal
    % out on right
    if on_col + r > nsize
        add_up(end - (on_col + r - nsize) + 1:end) = add_up(end - (on_col + r - nsize) + 1:end) - nsize;
        add_down(end - (on_col + r - nsize) + 1:end) = add_down(end - (on_col + r - nsize) + 1:end) - nsize;
        add_right = add_right - nsize;
    end
    % out on left
    if on_col - r < 1
        add_up(1:(abs(on_col - r) + 1)) = add_up(1:(abs(on_col - r) + 1)) + nsize;
        add_down(1:(abs(on_col - r) + 1)) = add_down(1:(abs(on_col - r) + 1)) + nsize;
        add_left = add_left + nsize;
    end
    % out up
    if on_row - r < 1
        add_left(1:(abs(on_row - r) + 1)) = add_left(1:(abs(on_row - r) + 1)) + nsize^2;
        add_right(1:(abs(on_row - r) + 1)) = add_right(1:(abs(on_row - r) + 1)) + nsize^2;
        add_up = add_up + nsize^2;
    end      
    % out down
    if on_row + r > nsize
        add_left(end - (on_row + r - nsize) + 1:end) = add_left(end - (on_row + r - nsize) + 1:end) - nsize^2;
        add_right(end - (on_row + r - nsize) + 1:end) = add_right(end - (on_row + r - nsize) + 1:end) - nsize^2;
        add_down = add_down - nsize^2;
    end
    add_right = add_right(2:end-1);
    add_left  = add_left(2:end-1);    
else
    add_right = add_right(2:end-1);
    add_left  = add_left(2:end-1);
    % out on right
    if on_col + r > nsize
        add_up = add_up(1:end - (on_col + r - nsize));
        add_down = add_down(1:end - (on_col + r - nsize));
        add_right = [];
    end
    % out on left
    if on_col - r < 1
        add_up = add_up(abs(on_col - r) + 2:end);
        add_down = add_down(abs(on_col - r) + 2:end);
        add_left = [];
    end    
    % out up
    if on_row - r < 1
        if r > 1; add_left = add_left(abs(on_row - r) + 1:end); end;
        if r > 1; add_right = add_right(abs(on_row - r) + 1:end); end;
        add_up = [];
    end
    % out down
    if on_row + r > nsize
        if r > 1; add_left = add_left(1:end - (r + on_row - nsize - 1)); end;
        if r > 1; add_right = add_right(1:end - (r + on_row - nsize - 1)); end;
        add_down = [];
    end    
end

list_of_neurons = [add_up add_down add_left add_right];

⌨️ 快捷键说明

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