%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 隣接近傍点リスト( xxF ) とその距離( xxD ) を使って 皮質に沿って測った距離が指定された半径以内にある点を探索する %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% INPUT Rmax : 最大半径 Pindx : 中心点のインデックス Pmin : Pmin より大きい強度を持つ点を探す xxF{i} : 隣接近傍点インデックス xxD{i} : 隣接近傍点距離 Pval : 強度 Vindx : 探索するインデックスの範囲, Pval(n) <-> Vindx(n) OUTPUT nextID : 近傍点インデックス nextDD : 近傍点距離 nextPP : 近傍点の強度 Made by Masa-aki Sato on 2003/4/26 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, nextPP, nextDD] = ... 0002 vb_find_neighbor_val(Rmax,Pindx,Pmin,xxF,xxD,Pval,Vindx) 0003 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 0004 % 隣接近傍点リスト( xxF ) とその距離( xxD ) を使って 0005 % 皮質に沿って測った距離が指定された半径以内にある点を探索する 0006 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 0007 % INPUT 0008 % Rmax : 最大半径 0009 % Pindx : 中心点のインデックス 0010 % Pmin : Pmin より大きい強度を持つ点を探す 0011 % xxF{i} : 隣接近傍点インデックス 0012 % xxD{i} : 隣接近傍点距離 0013 % Pval : 強度 0014 % Vindx : 探索するインデックスの範囲, Pval(n) <-> Vindx(n) 0015 % OUTPUT 0016 % nextID : 近傍点インデックス 0017 % nextDD : 近傍点距離 0018 % nextPP : 近傍点の強度 0019 % 0020 % Made by Masa-aki Sato on 2003/4/26 0021 % 0022 % Copyright (C) 2011, ATR All Rights Reserved. 0023 % License : New BSD License(see VBMEG_LICENSE.txt) 0024 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 0025 % アルゴリズム : 最近傍点リストを用いた Tree 探索 0026 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 0027 %1.自分自身をルートにする 0028 %2.各ルート点の隣接近傍点の集合を候補点リストに登録する 0029 %3.候補点リストの中でこれまでに試されていない新しい候補点を抽出する 0030 %4.出発点から候補点までの累積距離を計算(経路に依存) 0031 %5.出発点から候補点までの最短累積距離を求める 0032 %6.累積距離が指定半径以内にあり強度が閾値以上の点を見つける 0033 %7.上記の点を新しいルートにして2.へ戻る 0034 %8.指定半径以内にある新しいルートが無くなったときに終了 0035 0036 %%%%%%%% Initialization %%%%%%%%%% 0037 0038 % Vindx : 探索するインデックスの範囲, Pval(n) <-> Vindx(n) 0039 % 頂点インデックスを Pval のインデックスに変換 0040 Npoint = size(xxF,1); 0041 ID = zeros(Npoint,1); 0042 ID(Vindx) = (1:length(Vindx))'; 0043 0044 nextID = Pindx; % 近傍点インデックス 0045 nextDD = 0; % 近傍点累積距離 0046 nextPP = Pval( ID(Pindx) ); % 強度リスト 0047 0048 itree = 0; % tree number 0049 rootix = Pindx; % ルートのインデックス 0050 rootd = 0; % ルートの累積距離 0051 0052 %%%%% Tree search %%%%% 0053 0054 while itree==0 | ~isempty(rootix), 0055 itree = itree+1; 0056 nroot = size(rootix,1); % ルートの数 0057 0058 % 候補点 : 全てのルートの隣接近傍点 0059 ixlist = []; % 隣接近傍点インデックス 0060 ddlist = []; % 隣接近傍点への累積距離 0061 0062 for i=1:nroot, 0063 iroot = rootix(i); % ルートのインデックス 0064 ixlist = [ixlist; xxF{iroot}]; % 隣接近傍点インデックス 0065 ddlist = [ddlist; xxD{iroot} + rootd(i) ]; % 隣接近傍点への累積距離 0066 end; 0067 0068 % 候補点の絞り込み 0069 ixuniq = unique(ixlist); % 重複インデックスを削除 0070 nextix = vb_setdiff2(ixuniq,nextID); % 探索済みのインデックスを削除 0071 0072 % 探索範囲のインデックスを抽出 0073 ixid = ID(nextix); 0074 ixz = find( ixid > 0 ); % nextix の中で Vindx に含まれるものを抽出 0075 ixid = ixid(ixz); % nextix に対応する Pval インデックス 0076 0077 % 強度が Pmin 以上の点を抽出 0078 ixval = find( Pval( ixid ) >= Pmin ); 0079 nextix = nextix( ixz(ixval) ); 0080 nextP = Pval( ixid(ixval) ); 0081 0082 % 探索候補点インデックス 0083 nextix = nextix(:); 0084 Nnext = length(nextix); 0085 nextd = zeros(Nnext,1); 0086 0087 for i=1:Nnext, % Loop of new dipoles 0088 % nextix(i) が ixlist の何番目のインデックスか調べる 0089 jx = find( nextix(i)==ixlist ); 0090 0091 % nextix(i) への最短累積距離 0092 nextd(i) = min(ddlist(jx)); 0093 end 0094 0095 % 最大半径以内の候補点を探す 0096 okix = find(nextd<Rmax); % 最大半径以内の候補点を探す 0097 rootix = nextix(okix); % 最大半径以内の候補点(次回のルート点) 0098 rootd = nextd(okix); % 最短累積距離 0099 nextP = nextP(okix); % 強度 0100 0101 % 近傍点リスト 0102 nextID = [nextID ; rootix ]; % 近傍点リスト 0103 nextDD = [nextDD ; rootd ]; % 最短累積距離 0104 nextPP = [nextPP ; nextP ]; % nextID に対応する強度 0105 end