#author("2023-12-11T02:12:12+09:00","default:Miyashita","Miyashita")
#author("2023-12-11T02:12:27+09:00","default:Miyashita","Miyashita")
*特定の値に最も近い値(点)の抽出 [#p5d5944f]
#contents
~
値の近さと距離の近さについて考える.~
まあ,近い値というのも1次元の数直線を想定したら距離とみなせるので基本は同じですが...~
~
ちなみに,下記で使われている関数 knnsearch を使うには,~
[[Statistics and Machine Learning Toolbox>https://jp.mathworks.com/help/stats/index.html]] が必要.~
~

**1次元ベクトルから最も近い値の抽出 [#c85abfed]
ベクトルX (ny 行1列)の中から,ある値 P に最も近い値を探す.
#codeprettify(lang-matlab){{
IDX = knnsearch(X,P);
}}
このとき,Xは縦のベクトルでないとエラーを返すので注意.Nx1 配列はOK, 1xN 配列はエラーになる.~
IDX はインデックスで,X(IDX) が最も P に近い値となる.~
~

**2次元空間の格子点から,指定点と最も距離が近い点(最近傍点)の抽出 [#wa58f630]
基本形は下記の通り.xq,yq (それぞれ Nx1 配列)または P (Nx2 配列)の N 個の点に対する最近傍点を検出する.~
入力引数は2つであることに注意.
#codeprettify(lang-matlab){{
[IDX,D] = knnsearch([X,Y], [xq yq]); % 方法1
}}
#codeprettify(lang-matlab){{
[IDX,D] = knnsearch([X,Y], P); % 方法2 P = [x y]
}}
matlab 関数 [[meshgrid>https://jp.mathworks.com/help/matlab/ref/meshgrid.html]] で出力される X,Y のような2次元空間について,ある点 (xq,yq) に最も近い点を抽出するときは,(X,Y) のペアを Nx2 配列に変換する.~
#codeprettify(lang-matlab){{
[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) との距離.~
IDX は最近傍点の線形インデックス.ind2sub で線形インデックスを変換することで,最近傍点の X,Y 座標がわかる.
#codeprettify(lang-matlab){{
% (X,Y) の中で (xq,yq) に最も近い点の抽出
XX = X(IDX);
YY = Y(IDX);

% 線形インデックスから最近傍となる配列の要素を抽出
[row,col] = ind2sub(size(X),IDX);
}}
~

**2次元 または 3次元 の点群(格子でも可)中の最近傍点の抽出 [#d7c1b689]
knnsearch なんか使わなくても [[dsearchn>https://jp.mathworks.com/help/matlab/ref/dsearchn.html]] を使えば良いことがわかった.~
使い方は knnsearch と変わらず.~
#codeprettify(lang-matlab){{
[IDX,D] = dsearchn([X(:), Y(:)],[xq, yq]);
}}
~
~

**もっと単純な方法 [#b684522b]
そもそも,メッシュ状の候補点から最も近い点を出すには特別な関数を使うまでもなく,差を最小にするインデックスを求めるだけで良い.
#codeprettify(lang-matlab){{
ind = zeros(length(xq),1);
for k = 1:length(xq)
    [~,ind(k)] = min(abs(X(:)-xq(k)));
end
}}
2次元の場合でも, x, y 軸が等間隔で直交である限りは,それぞれの軸で独立で求めればOK.
2次元の場合でも,x, y 軸が等間隔で直交である限りは,それぞれの軸で独立で求めればOK.
~
~



***参考 MathWorks公式 [#j8821ad3]
-[[dsearchn>https://jp.mathworks.com/help/matlab/ref/dsearchn.html]]
-[[knnsearch>https://jp.mathworks.com/help/stats/knnsearch.html]]

Front page   Edit Diff Attach Copy Rename Reload   New List of pages Search Recent changes   Help   RSS of recent changes