#author("2018-09-20T14:00:33+09:00","default:Miyashita","Miyashita")
#author("2018-11-20T20:18:36+09:00","default:Miyashita","Miyashita")
*最大値(最小値)がある要素の抽出 [#fc63647e]
配列の最大値,最小値を求めるだけでなく,その場所(インデックス,配列の添字)を知りたいことがよくある.~
2次元配列 A(x,y) であれば,
#codeprettify(lang-matlab){{
[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つすると,下記の方法で取得が可能.
#codeprettify(lang-matlab){{
ind = find(A == max(A(:))); %方法①, or
[maxval,ind] = max(A(:)); %方法②
}}
#codeprettify(lang-matlab){{
[i,j,k] = ind2sub(size(A),ind);
}}
i,j,k,...の個数は配列Aの次元(=ndims(A))と一致させる.~
最大値,最小値でなくとも,findであれば,特定の値を含んだ要素を抽出するのに使える.~
最大最小値の場合は方法②のmaxとminで返される線形インデックスを使った方がスマートかも.~
ただし,最大値となる要素が複数ある場合,方法②では1つしか抽出されない.全ての要素が必要なら方法①.
ただし,最大値となる要素が複数ある場合,方法②では1つしか抽出されない.全ての要素が必要なら方法①.~

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

***参考 MathWorks公式 [#z8f11c02]
-[[ind2sub>https://jp.mathworks.com/help/matlab/ref/ind2sub.html]]

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