logo

ジュリアで配列の差分を計算する方法 📂ジュリア

ジュリアで配列の差分を計算する方法

概要

Juliaでは、差分を計算するためにdiff()関数が提供されている1circshift()関数も使って簡単に書けるけど、端点の処理などがちょっと面倒に感じるから、知ってるとずっと楽になる。RMatlabdiff()関数とほぼ同じ方法で使えるが、これらと違い2次差分(差分を二回とること)などは特に実装されていない。

コード

基本的な使い方

julia> x = rand(0:9, 12)
12-element Vector{Int64}:
 3
 1
 9
 7
 1
 0
 6
 5
 3
 2
 9
 9

例えば上記のような配列がある場合、ただdiff()を適用して、前の要素と後ろの要素の差を計算した結果を得ることができる。結果から配列のサイズが正確に1だけ縮小されたのを確認できる。

julia> diff(x)
11-element Vector{Int64}:
 -2
  8
 -2
 -6
 -1
  6
 -1
 -2
 -1
  7
  0

多次元配列

julia> X = reshape(x, 3, :)
3×4 Matrix{Int64}:
 3  7  6  2
 1  1  5  9
 9  0  3  9

julia> diff(X)
ERROR: UndefKeywordError: keyword argument dims not assigned
Stacktrace:
 [1] diff(a::Matrix{Int64})
   @ Base .\multidimensional.jl:997
 [2] top-level scope
   @ c:\Users\rmsms\OneDrive\lab\DataDrivenModel\REPL.jl:7

例えば、上記のような多次元配列がある場合、ただdiff()を適用するとエラーになる。これは、配列を押す方向が与えられていないためであり、次のようにdimsを引数にしてどの次元で差分を計算するかを決める必要がある。1次元の場合と同じように、差分をとった方向で長さが1ずつ短くなることに注意。

julia> diff(X, dims = 1)
2×4 Matrix{Int64}:
 -2  -6  -1  7
  8  -1  -2  0

julia> diff(X, dims = 2)
3×3 Matrix{Int64}:
  4  -1  -4
  0   4   4
 -9   3   6

全コード

x = rand(0:9, 12)
diff(x)

X = reshape(x, 3, :)
diff(X)
diff(X, dims = 1)
diff(X, dims = 2)

環境

  • OS: Windows
  • julia: v1.8.5