MATLAB移民のためのJulia tips

MATLAB移民のためのJulia tips

何も考えずに速く計算できないのならば、何もやりたくない。

配列・行列のなかで条件を満たすものを取り出す・要素数を出す

条件がベクトル・行列で与えられている場合

その場合はこちら:

julia.hatenablog.jp

以下の節で説明するのは、条件が数である場合。

Julia v1.0から、スパース行列を扱う場合はusing SparseArraysを読み込む必要があります。

配列・行列のなかで条件を満たすものを取り出す

配列から値を取り出す

例えば
v = [1 2 2 3 5]
のなかで2以上の要素の値を取り出すには

filter(x->x>2, v)

または

v[v.>2]

ここで、.は、「要素ごとに見る」というやつ。

配列からインデックスを取り出す

find(x->(x>2),v)

または、

find(v.>2)

行列から値を取り出す

例えば
A = [7 10; 5 9; 9 8]
という3-by-2の行列で、 一列目の要素が9である行を取り出すには、

A[A[:,1].==9,:]

配列と本質的には同じだけど、.のことを知らないと、ハマる。

行列からインデックスを取り出す

find(A[:,1].>6)

2-element Array{Int64,1}:
1
3

(スパース)行列で非ゼロの要素を取り出す

ここでの操作はデータの型としてスパース行列*1になっていないとダメ。

行列Aをスパース行列として持っていなければ、

B = [0 1 2 0; 0 0 0 5]
B = sparse(B)

として変換しておく。
非ゼロの要素を取り出すには、

nonzeros(B)

3-element Array{Int64,1}:
1
2
5

インデックスを取り出しは、前節と同様。

配列・行列のなかで条件を満たす要素数を出す

条件を満たす要素の数:MATLABのnnz()

Juliaではcountnzなので注意

v0.7からcountnzは廃止になり、count関数を使うことになったようです。

https://github.com/JuliaLang/julia/pull/23485

例えば、

a = [3 5 6 8]
# countnz(a.<6)  # v0.6
count(a.<6) # > v0.7

2
配列でも行列でも同じ。

(スパース)行列の非ゼロ要素数

じゃあJuliaでnnzは?というと、それはスパース行列の非ゼロ要素数
こんなかんじ。

I = [1 2 4 1]'
J = [2 1 5 2]'
V = ones(4,1)
M = sparse(I[:,1],J[:,1],V[:,1])
nnz(M)

3

  • (1,2)要素は重複しているので、これはカウントされていない。(これはnnzの性質ではなくて、sparseの話。)
  • 普通の行列として持っている場合には、ちゃんとスパース行列の型にしておく。

*1:データがスパース性を持っているかとは関係ない。