MATLAB移民のためのJulia tips

MATLAB移民のためのJulia tips

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

条件を満たす行を行列から検索・抽出・削除

MATLABismember

例えば、

a = [1 2 3; 7 8 9]
B = [1 2 3;4 5 6;7 8 9;10 11 12]

行列Bのなかで、行列aの行と同じ要素を持っている行を検索・抽出・削除したい、というとき。

aが数の場合

行単位ではなく、Bの行列要素一つ一つを判定したい場合は、他の記事

julia.hatenablog.jp

でできる。 判定する要素が複数ある場合は、ここでの方法をマネしてやってみるとできるはず。

aがベクトルの場合

もし判定する行が1つだけの場合、例えば

a = [1 2 3]

のときは、

indices = Bool[ a == B[i,:] for i=1:size(B,1) ]

とすればマッチする行がtrue/falseで返ってくる。今の場合、{true, false, false, false} となる。

Bのなかでaと一致する行を削除したければ、

B[!indices,:]

# 4   5   6
# 7   8   9
# 10  11  12

aが行列の場合

一番上に挙げた例のように、判定する行が複数ある場合は、まずaを行ごとに区切られた多次元配列に分解:

as = [a[k,:] for k=1:size(a,1)]

ちなみにこれの中身はこんなかんじ:

# 2-element Array{Any,1}:
# 1x3 Array{Int64,2}:
# 1  2  3
# 1x3 Array{Int64,2}:
# 7  8  9

これを使って次のように判定:

indices = Bool[ B[i,:] in as for i=1:size(B,1) ]

Bのなかでaと一致する行を削除したければ、前節と同様に

B[!indices,:]

# 4   5   6
# 10  11  12

参考にさせていただいたもの:

Julia: find row in matrix - Stack Overflow