#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]]