最大値(最小値)がある要素の抽出

配列の最大値,最小値を求めるだけでなく,その場所(インデックス,配列の添字)を知りたいことがよくある.
2次元配列 A(x,y) であれば,

[row,col] = find(A == max(A(:)));

でAij の添字i,j を求められる.
しかし,findの出力引数は2次元までしか対応していない.そのため,3次元以上の A(x,y,z) や A(t,x,y) , A(t,x,y,z) の場合は,線形インデックスから変換する必要がある.
findの出力引数を1つすると,下記の方法で取得が可能.

ind = find(A == max(A(:))); %方法①, or
[maxval,ind] = max(A(:)); %方法②
[i,j,k] = ind2sub(size(A),ind);

i,j,k,...の個数は配列Aの次元(=ndims(A))と一致させる.
最大値,最小値でなくとも,findであれば,特定の値を含んだ要素を抽出するのに使える.
最大最小値の場合は方法②のmaxとminで返される線形インデックスを使った方がスマートかも.
ただし,最大値となる要素が複数ある場合,方法②では1つしか抽出されない.全ての要素が必要なら方法①.

また,Aが浮動小数点数の配列の場合,精度の関係でfindを使う方法に問題はないのか?という疑問はある(確認はしていない)

参考 MathWorks公式


Front page   Edit Diff Attach Copy Rename Reload   New List of pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2018-11-20 (Tue) 11:18:36 (2151d)