MATLABのTips maxやminの裏ワザ

スポンサーリンク

本日はmaxとminの隠れた機能について説明します。
使いこなせればコードが非常に短く書くことができます。

ここでmax関数のおさらいです。
MATLABのhelp機能でmax関数を検索すると、下記説明が出力されます。

>> help max
  MAX   最大要素
  
  X がベクトルの場合、MAX(X) は、X の最大要素を出力します。X が行列の場合、
  MAX(X) は、各列の最大要素を含む行ベクトルを出力します。X がN次元配列の
  場合、MAX(X) は最初に 1 でない次元について最大要素を出力します。
 
  [Y,I] = MAX(X) は、ベクトルIに最大値のインデックスを出力します。最初に
  1 でない次元で、最大値をもつ要素が複数ある場合は、最初のインデックスが
  出力されます。
 
  MAX(X,Y) は、X,Y の対応する要素の内、大きいものを出力し、X,Y と同じ
  サイズの配列を出力します。また、X,Y のどちらかがスカラでも構いません。
 
  [Y,I] = MAX(X,[],DIM) は、次元 DIM に対して機能します。
 
  複素数の入力に対しては、MAX(ABS(X)) が使われ、角度 ANGLE(X) は無視
  されます。最大要素の計算では、NaN を無視します。
 
  例: 
    X = [2 8 4   の場合、max(X,[],1)は [7 8 9] です。
         7 3 9]
 
    max(X,[],2) は、[8  で、max(X,5) は、[5 8 5
                     9]                   7 5 9] です。
 
  参考  min, median, mean, sort.

    Overloaded methods:
       timeseries/max
       darray/max
       quantizer/max
       fints/max
       ordinal/max

    Reference page in Help browser
       doc max

MATLABを使ったことのある人なら一度は確認したことあると思います。

では、一度max関数やmin関数のことは忘れて頂いて、下記のような問題を解きたい場合どうしますか?

スポンサーリンク

問題:行列A=[1 2 3;4 5 6;7 8 9]の要素を5以上にしたい。5以下の場合は要素を5に置き換えたい。
この問題どのように解きますか?
私の大学生時代ならこのように解くと思います。(下記コードはスマートではない解き方の一例です。)

A=[1 2 3;4 5 6;7 8 9];
for ii1=1:size(A,1)
    for ii2=1:size(A,2)
        if A(ii1,ii2)<=5
        A(ii1,ii2)=5;
        end
    end
end

実は上記問題はたったの一行でコーディングできます!!! 知りないと損ですよ。(じゃあどこで使うのか?という質問がありそうですが….) 正解は下記です。

max(a,5)

そうですたったこれだけ

>> a=[1 2 3;4 5 6;7 8 9]

a =

     1     2     3
     4     5     6
     7     8     9

>> max(a,5)

ans =

     5     5     5
     5     5     6
     7     8     9

同様にmin関数でもできます。

>> a=[1 2 3;4 5 6;7 8 9]

a =

     1     2     3
     4     5     6
     7     8     9

>> min(a,5)

ans =

     1     2     3
     4     5     5
     5     5     5

これはですね、これまでにコードをバリバリ書いたことがある人ならばどこで使うのか察しがついたと思います。
将来的にはこの辺までまとめられるといいのですが、ここら辺まで言語化するのは相当難しいので、今回はこの辺で終わりたいと思います。

今回はこのへんでGood luck

スポンサーリンク

コメント