find neighbor [nextID, nextDD] = vb_find_neighbor(Rmax, Pindx, xxF, xxD ) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 隣接近傍点リスト( xxF ) とその距離( xxD ) を使って 皮質に沿って測った距離が指定された半径以内にある点を探索する %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% INPUT Rmax : 最大半径 Pindx : 中心点のインデックス xxF{i} : 隣接近傍点インデックス xxD{i} : 隣接近傍点距離 OUTPUT nextID : 近傍点インデックス nextDD : 近傍点距離 Made by Masa-aki Sato on 2003/4/28 Copyright (C) 2011, ATR All Rights Reserved. License : New BSD License(see VBMEG_LICENSE.txt) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% アルゴリズム : 最近傍点リストを用いた Tree 探索 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1.自分自身をルートにする 2.各ルート点の隣接近傍点の集合を候補点リストに登録する 3.候補点リストの中でこれまでに試されていない新しい候補点を抽出する 4.出発点から候補点までの累積距離を計算(経路に依存) 5.出発点から候補点までの最短累積距離を求める 6.累積距離が指定半径以内にある点を見つける 7.上記の点を新しいルートにして2.へ戻る 8.指定半径以内にある新しいルートが無くなったときに終了
0001 function [nextID, nextDD] = vb_find_neighbor(Rmax, Pindx, xxF, xxD ) 0002 % find neighbor 0003 % [nextID, nextDD] = vb_find_neighbor(Rmax, Pindx, xxF, xxD ) 0004 % 0005 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 0006 % 隣接近傍点リスト( xxF ) とその距離( xxD ) を使って 0007 % 皮質に沿って測った距離が指定された半径以内にある点を探索する 0008 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 0009 % INPUT 0010 % Rmax : 最大半径 0011 % Pindx : 中心点のインデックス 0012 % xxF{i} : 隣接近傍点インデックス 0013 % xxD{i} : 隣接近傍点距離 0014 % OUTPUT 0015 % nextID : 近傍点インデックス 0016 % nextDD : 近傍点距離 0017 % 0018 % Made by Masa-aki Sato on 2003/4/28 0019 % 0020 % Copyright (C) 2011, ATR All Rights Reserved. 0021 % License : New BSD License(see VBMEG_LICENSE.txt) 0022 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 0023 % アルゴリズム : 最近傍点リストを用いた Tree 探索 0024 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 0025 %1.自分自身をルートにする 0026 %2.各ルート点の隣接近傍点の集合を候補点リストに登録する 0027 %3.候補点リストの中でこれまでに試されていない新しい候補点を抽出する 0028 %4.出発点から候補点までの累積距離を計算(経路に依存) 0029 %5.出発点から候補点までの最短累積距離を求める 0030 %6.累積距離が指定半径以内にある点を見つける 0031 %7.上記の点を新しいルートにして2.へ戻る 0032 %8.指定半径以内にある新しいルートが無くなったときに終了 0033 0034 nextID = Pindx; % 近傍点インデックスリスト 0035 nextDD = 0; % 近傍点累積距離リスト 0036 rootix = Pindx; % ルートのインデックスリスト 0037 rootd = 0; % ルートの累積距離リスト 0038 itree = 0; % tree number 0039 0040 while itree==0 | ~isempty(rootix), 0041 itree = itree+1; 0042 nroot = size(rootix,1); % 今回のルート点数 0043 0044 % 候補点 : 全てのルートの隣接近傍点 0045 ixlist = []; % 隣接近傍点インデックスリスト 0046 ddlist = []; % 隣接近傍点への累積距離リスト 0047 0048 for i=1:nroot, 0049 iroot = rootix(i); % ルートのインデックス 0050 ixlist = [ixlist; xxF{iroot}]; % 隣接近傍点インデックス 0051 ddlist = [ddlist; xxD{iroot} + rootd(i) ]; % 隣接近傍点への累積距離 0052 end; 0053 0054 % 候補点の絞り込み 0055 ixuniq = unique(ixlist); % 重複インデックスを削除 0056 nextix = vb_setdiff2(ixuniq,nextID); % 探索済みのインデックスを削除 0057 0058 % 探索候補点インデックス 0059 nextix = nextix(:); 0060 Nnext = length(nextix); 0061 nextd = zeros(Nnext,1); 0062 0063 for i=1:Nnext, % Loop of new dipoles 0064 % ixlist の中で nextix(i) に等しいインデックスを抽出 0065 jx = find( nextix(i)==ixlist ); 0066 0067 % nextix(i) への最短累積距離を探す 0068 nextd(i) = min(ddlist(jx)); 0069 end 0070 0071 % 最大半径以内の候補点を探す 0072 okix = find(nextd<Rmax); % 最大半径以内の候補点を探す 0073 rootix = nextix(okix); % 最大半径以内の候補点(次回のルート点) 0074 rootd = nextd(okix); % その最短累積距離 0075 0076 % 近傍点リスト 0077 nextID = [nextID ; rootix ]; % 近傍点リスト 0078 nextDD = [nextDD ; rootd ]; % 最短累積距離 0079 end