MATLAB: 配列から一番近い値とindexを取得する

配列から一番近い値とindexを取得する場合は、非常によくある。

実はMATLABにはknnsearchといコマンドが準備されている。ただし、これはStatistics and Machine Learning Toolboxが必要だ。

上のindexを取得したい仕事の内容が機械学習のネタならこれを使えば良いが、そうでない場合はわざわざこの関数一つのためにToolboxをインストールしたり、ライセンスを使うことはやりたくない。

というわけで、基本的なMATLAB関数で配列から一番近い値とindexを取得する方法のメモ。 minの返り値を配列にすると、2番目の返り値は「最小値になるインデックス」を返すことを利用している。

ちなみにMATLABの「癖」として、このように「関数が複数の返り値持つが、スカラーでも返り値を受けることが出来る。その場合は特定の結果のみ取得できる。配列で返り値を受けると、全ての結果を取得できる」というものがある。良く知っていると思っていた関数が実は複数の返り値を持つことはよくある。たまに確認してみると良い。

下の例は対象の配列と探す値の差の絶対値をとる。これは差の配列になるので、その最小値を求めるという考え方。

% 最も近い時間データのインデックスを取得
time_query = 2.41; % [sec] 
time_data  = 0:1e-3:10;

[~,idx]    = min(abs(time_query - time_data));
% 最も近い値
time_nearest = time_data(idx);

JavaScriptで似たようなものは [javascript]配列から最も近い値を探す – Qiita にある。