条件を満たす行を行列から検索・抽出・削除
MATLABのismember
。
例えば、
a = [1 2 3; 7 8 9] B = [1 2 3;4 5 6;7 8 9;10 11 12]
行列Bのなかで、行列aの行と同じ要素を持っている行を検索・抽出・削除したい、というとき。
aが数の場合
行単位ではなく、Bの行列要素一つ一つを判定したい場合は、他の記事
でできる。 判定する要素が複数ある場合は、ここでの方法をマネしてやってみるとできるはず。
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
参考にさせていただいたもの: