find関数の使い方

Octaveにはfind()という関数がある。find()の基本的な構造は

IDX=find(X)

であるが、ここでXもIDXも一般的にはベクトルと思ってくれてよい*1。この関数の役割はこうだ:
find()関数はXの中から0でない要素の位置をIDXで返す。
例えばX=[1,0,2,0,3,4,0,5]とすると、0でない要素の位置はそれぞれ1番目、3番目、5番目、6番目、8番目となるので、IDX=[1,3,5,6,8]という返値が返ってくる。

octave:1>X=[1,0,2,0,3,4,0,5]
X =

   1 0 2 0 3 4 0 5

octave:2>find(X)
ans =

   1 3 5 6 8

したがって、このfind()の返値をXの列数に指定してあげれば、0でない値が返ってくることになる。

octave:3>X(find(X))
ans =

   1 2 3 4 5

ここで「0以外の値」ではなく「ある数値以外の値」を返したい場合は、ある値をXから引いたベクトルをfind()に入れてあげればよい。すなわち:

octave:1>X=[1,4,1,4,2,1,3,5,6]
X =

   1 4 1 4 2 1 3 5 6

octave:2>X(find(X-1))
ans =

   4 4 2 3 5 6

ちなみに、find()はXの中から0以外の要素の位置を返したが、ある値の要素の位置を返すには==を駆使すればよい。==だけでは以下のように、ある値の要素の位置を1、それ以外を0で返す。

octave:3>X==1
ans =

   1 0 1 0 0 1 0 0 0

ここでfind()を用いて以下のようにすればよい。

octave:4>find(X==1)
ans =

   1 3 6

Octave環境:octave3.6.2_gcc4.6.2/Windows 7 Professional

*1:Xは行列でもよいことになっているが、実際にここに行列を入れて使うことは少ないと思われる。