ジュリアで配列の差分を計算する方法
概要
Juliaでは、差分を計算するためにdiff()
関数が提供されている1。circshift()
関数も使って簡単に書けるけど、端点の処理などがちょっと面倒に感じるから、知ってるとずっと楽になる。RやMatlabのdiff()
関数とほぼ同じ方法で使えるが、これらと違い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