特定の値に最も近い値(点)の抽出 †
1次元ベクトルから最も近い値の抽出 †ベクトルX (ny 行1列)の中から,ある値 P に最も近い値を探す. IDX = knnsearch(X,P); このとき,Xは縦のベクトルでないとエラーを返すので注意.Nx1 配列はOK, 1xN 配列はエラーになる. 2次元空間の格子点から,指定点と最も距離が近い点(最近傍点)の抽出 †基本形は下記の通り.xq,yq (それぞれ Nx1 配列)または P (Nx2 配列)の N 個の点に対する最近傍点を検出する. [IDX,D] = knnsearch([X,Y], [xq yq]); % 方法1 [IDX,D] = knnsearch([X,Y], P); % 方法2 P = [x y] matlab 関数 meshgrid で出力される X,Y のような2次元空間について,ある点 (xq,yq) に最も近い点を抽出するときは,(X,Y) のペアを Nx2 配列に変換する. [IDX,D] = knnsearch([X(:), Y(:)],[xq, yq]); %[IDX,D] = knnsearch([reshape(X, [ny*nx, 1]), reshape(Y,[ny*nx, 1])],[xq, yq]); % 長く書くと D は最近傍点と (xq,yq) との距離. % (X,Y) の中で (xq,yq) に最も近い点の抽出 XX = X(IDX); YY = Y(IDX); % 線形インデックスから最近傍となる配列の要素を抽出 [row,col] = ind2sub(size(X),IDX); 2次元 または 3次元 の点群(格子でも可)中の最近傍点の抽出 †knnsearch なんか使わなくても dsearchn を使えば良いことがわかった. [IDX,D] = dsearchn([X(:), Y(:)],[xq, yq]);
もっと単純な方法 †そもそも,メッシュ状の候補点から最も近い点を出すには特別な関数を使うまでもなく,差を最小にするインデックスを求めるだけで良い. ind = zeros(length(xq),1); for k = 1:length(xq) [~,ind(k)] = min(abs(X(:)-xq(k))); end 2次元の場合でも,x, y 軸が等間隔で直交である限りは,それぞれの軸で独立で求めればOK.
参考 MathWorks公式 † |