#author("2019-05-22T15:43:40+09:00","default:Miyashita","Miyashita")
#author("2019-05-22T15:57:08+09:00","default:Miyashita","Miyashita")
*指定値に最も近い値(点)の抽出 [#p5d5944f]
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]
基本形は下記の通り.x0,y0(それぞれ Nx1 配列)またはP( Nx2 配列)のN個の点に対する最近傍点を検出する.~
入力引数は2つであることに注意.
#codeprettify(lang-matlab){{
[IDX,D] = knnsearch([X,Y],[x0 y0]) % 方法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次元空間について,ある点(x0,y0) に最も近い点を抽出するときは,reshapeを使って(X,Y)の格子点を Nx2 配列に変換する.~
#codeprettify(lang-matlab){{
[IDX,D] = knnssearch([reshape(X,[ny*nx 1]),reshape(Y,[ny*nx 1])]),[x0 y0])
[IDX,D] = knnsearch([reshape(X,[ny*nx 1]),reshape(Y,[ny*nx 1])],[x0 y0])
}}
Dは最近傍点と (x0,y0) との距離.~
IDXは最近傍点の線形インデックス.ind2subで線形インデックスを変換することで,最近傍点のX,Y座標がわかる.
#codeprettify(lang-matlab){{
% (X,Y)の中で(x0,y0)に最も近い点の抽出
XX = X(IDX);
YY = Y(IDX);
% 線形インデックスから最近傍となる配列の要素を抽出
[row,col] = ind2sub(size(X),IDX)
}}


***参考 MathWorks公式 [#j8821ad3]
-[[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