バックナンバーはこちら。
https://www.simulationroom999.com/blog/compare-matlabpythonscilabjulia3-backnumber/
はじめに
非極大値抑制をプログラムを作成しているときに出てきた、
線形インデックスサーチと論理インデックスサーチについて説明。
今回は、論理インデックスサーチについて
登場人物
博識フクロウのフクさん
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
論理インデックスサーチ
前回は、MATLABで線形インデックスサーチを説明してもらったけど、
論理インデックスサーチってのもできるんだよね?
これはどういったものになるの?
0 or 1、またはfalse or trueのベクトル、行列をもって、該当のベクトル、行列への参照や書き込みを行う機能だな。
言葉で言われても何やってるのかわからん。
まぁ、実際に動きを見ればわかると思うよ。
MATLABで論理インデックスサーチ
前回と同じようにまずは11~19の9要素を3×3の行列にする。
>> A=[11:19]
A =
11 12 13 14 15 16 17 18 19
>> A=reshape(A,3,3)
A =
11 14 17
12 15 18
13 16 19
前回は、これに対して線形インデックスサーチをしたんだよね。
そして、論理インデックスを用意する。
>> B=11<A & A<16
B =
0 1 0
1 1 0
1 0 0
お、こんな感じで一括で評価ができるのか。
論理インデックスを行列の添え字としてあてこむ。
>> A(B)
ans =
12
13
14
15
え?該当する箇所の要素だけ抜き出された!
さらにtrue、false形式でも試してみる。
>> A([false true false;false true false; false true false])
ans =
14
15
16
この指定のOKなのか。
findによるインデックス取得
手法としては、線形インデックスサーチに関わる話になるが、
性格として論理インデックス的な手法もある。
なにそれ?
MATLABの場合だとfindという関数を使うパターンだな。
今回の論理インデックスサーチに近い使い方ができる。
>> C=find(11<A & A<16)
ans =
2
3
4
5
>> A(C)
ans =
12
13
14
15
なるほど。
評価するパターンだから論理インデックスサーチっぽいけど、
内部処理としては線形インデックスサーチになるのか。
これらは各環境、各言語で使用できるパターンだから、次回にでもまとめをやろう。
まとめ
まとめだよ。
- MATLABで論理インデックスサーチの挙動を確認。
- 評価式の結果が論理インデックスとなり、それを行列に渡すことで1、またはtrueの部分の要素の参照及び書き換えが可能。
- find関数を使用すると評価式に該当する線形インデックスが取得できる。
- これらはMATLAB以外の環境、言語でも使用できることが多い。
バックナンバーはこちら。
コメント