MATLAB、Python、Scilab、Julia比較ページはこちら
https://www.simulationroom999.com/blog/comparison-of-matlab-python-scilab/
はじめに
の、
MATLAB,Python,Scilab,Julia比較 第3章 その45【インデックスサーチ①】
MATLAB,Python,Scilab,Julia比較 第3章 その46【インデックスサーチ②】
非極大値抑制をプログラムを作成しているときに出てきた、
線形インデックスサーチと論理インデックスサーチについて説明。
インデックスサーチとは?
非極大値抑制のプログラムを作成した時に
線形インデックスサーチと論理インデックスサーチを使用した。
それについて説明する。
インデックスサーチというのは、
端的に言うとベクトル、行列の特定の要素の抜き出しを行う機能。
配列で言うと、添え字指定のイメージになる。
ただし、一般的な配列の添え字と異なる点もある。
それは、「一気に複数の添え字を指定できる。」という点。
MATLABで線形インデックスサーチ
これは、実際に見た方が早い。
まず、11~19の9要素の値を並べて、行列に形状を変える。
>> 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
通常、以下の感じで各要素にアクセスができる。
>> A(1,1)
ans =
11
これの添え字をベクトルにする。
>> A([1,2],1)
ans =
11
12
もうちょい複雑は線形インデックスサーチ
もっといろいろなことができる。
>> A([1,2],:)
ans =
11 14 17
12 15 18
>> A([1,3],[2,3])
ans =
14 17
16 19
添え字指定がベクトルにできると、こういった抜き出しもできる。
ちなみに、今回は読み出しだけが、書き込みにも使える。
実際、非極大値抑制の時は行列への書き込みにインデックスサーチを使用した。
論理インデックスサーチ
次に論理インデックスサーチについて。
これは、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
findによるインデックス取得
手法としては、線形インデックスサーチに関わる話になるが、
性格として論理インデックス的な手法もある。
MATLABの場合だとfindという関数を使うパターン。
今回の論理インデックスサーチに近い使い方ができる。
>> C=find(11<A & A<16)
ans =
2
3
4
5
>> A(C)
ans =
12
13
14
15
評価するパターンだから論理インデックスサーチっぽいが、
内部処理としては線形インデックスサーチになる。
まとめ
- MATLABで線形インデックスサーチと論理インデックスサーチの挙動を確認。
- 基本的な考え方は配列の添え字指定のベクトル化。
- 線形の場合は、要素番号、論理の場合は、0or1のテーブル指定。
MATLAB、Python、Scilab、Julia比較ページはこちら
コメント