logo

ジュリアのfind関数들 📂ジュリア

ジュリアのfind関数들

概要

ジュリアの基本組み込み関数は知れば知るほど便利だ。早速、例を見て学ぼう。

コード

x = [3, 7, 4, 5, 10, 3, 12, 3, 2, 4]

argmin(x)
argmax(x)
findmin(x)
findmax(x)
extrema(x)

findfirst(x .== 3)
findlast(x .== 3)
findall(x .== 3)

findnext(x .== 3, 5)
findprev(x .== 3, 5)

最適解 argmin(),argmax(),findmin(),findmax(),extrema()

最適解を見つける。

x = [3, 7, 4, 5, 10, 3, 12, 3, 2, 4]

julia> argmin(x)
9

julia> argmax(x)
7

y = [7, 8, 9, 9, 7, 9]

julia> argmax(y)
3

julia> findall(y.==maximum(y))
3-element Vector{Int64}:
 3
 4
 6

argmin(),argmax() はただの最適解、つまり値が最も大きく小さい場所のインデックスを返す。そんなインデックスが複数ある場合は最も小さいものを返す。だから、実際は argmax(x) $= \min(\argmax(x))$だ。本当の$\argmax$は、maximum() と下の findall() 関数と一緒に使えばいい。

x = [3, 7, 4, 5, 10, 3, 12, 3, 2, 4]

julia> findmin(x)
(2, 9)

julia> findmax(x)
(12, 7)

findmin(),findmax() は最適解とその値まで返す。

x = [3, 7, 4, 5, 10, 3, 12, 3, 2, 4]

julia> extrema(x)
(2, 12)

ちなみに extrema() はインデックスではなく、その値だけを返す。これは Rrange() 関数と同じだ1

条件を満たした最初・最後のインデックス findfirst(), findlast()

x = [3, 7, 4, 5, 10, 3, 12, 3, 2, 4]

julia> findfirst(x .== 3)
1

julia> findlast(x .== 3)
8

3が存在する最初と最後のインデックスを見つけた。配列の形が大まかに予想できる場合、これらを使ってコードの速度を向上させることができるだろう。

条件を満たした全てのインデックス findall()

x = [3, 7, 4, 5, 10, 3, 12, 3, 2, 4]

julia> findall(x .== 3)
3-element Vector{Int64}:
 1
 6
 8

使いやすく、一般的なプログラミングで最も役に立つ関数だ。maximum(), minimum()と一緒に使えば、全ての $\text{argmin}

条件を満たした特定範囲のインデックス findnext(), findprev()

julia> findnext(x .== 3, 5)
6

julia> findprev(x .== 3, 5)
1

前後である程度は例外として検索する必要がある時もある。例えば、配列の最初の要素と同じ要素を探す時にfindall()を使うと、その最初の要素も見つかってしまうので、煩わしいことになるかもしれない。

環境

  • OS: Windows
  • julia: v1.7.0