論理インデックスを用いた行抽出

matlabを使っていて、たまに「hoge列の値が正の行を取ってくる」とかいう操作をしたくなる時がある。

これくらいの要望だったらif文を書いてもいいのだけど、個人的にmatlabでは不要な所ではfor文を使いたくないし、

hoge列目の値がhugeで、homu列の値がhamuの行」とかなってくるとコードがすごい汚くなってくる。


そこでmatlabの便利機能に論理インデックスというのがあり、今回はそれを用いた行抽出プログラムをメモ。

    • matrixの一列目がindex1で、二列目がindex2である行の抽出
logIndex1 = (matrix(:,1) == index1) & (matrix(:,2) == index2);
//論理インデックスの種を作る。

logIndex2 = repmat(logIndex1, 1, COL_NUM) 
// COL_NUMはmatrixの行数。sizeでとってきてもよい。
// ここで一行の論理インデックスをmatrixのサイズと合わせる。

row = matrix(logIndex2);
//最後に1の部分だけを抽出。

もちろん一行にまとめて

row = matrix( repmat((matrix(:,1)==index1) & (matrix(:,2)==index2), 1, COL_NUM));

とも書けるけど、可読性も考えると個人的にはちゃんと分けて書いた方が好きだったり。



もちろん、もっと賢いやりかたもあるかもしれないけど。。。

しかしmatlabは便利だ。。


[参考]
http://ichiro-maruta.blogspot.com/2009/07/blog-post.html