6

誰かがこれを行う簡単な方法を教えてくれたら幸いです。MATLABに次のようなベクトルがあるとしましょう

d = [3 2 4 2 2 2 3 5 1 1 2 1 2 2 2 2 2 9 2]

連続した数「2」のシリーズとそれらのシリーズの長さを見つけたいです。

2 番は で簡単に見つけることができますx=find(d==2)。しかし、私が望むのは、一連の連続する 2 のすべての長さを含むベクトルを取得することです。つまり、この場合の結果は次のようなベクトルになります。

[1 3 1 5 1].

私を助けてくれる人はいますか?

4

3 に答える 3

9

これはうまくいくようです:

q = diff([0 d 0] == 2);
v = find(q == -1) - find(q == 1);

与える

v =

   1   3   1   5   1

私のため

于 2011-10-21T14:12:41.840 に答える
6

これをランレングス符号化と呼びます。http://www.mathworks.com/matlabcentral/fileexchange/4955-rle-deencodingで、適切な m-file を利用できます。この方法は一般に、以前に投稿された diff/find 方法よりも高速です。

tic
d_rle = rle(d==2);
d_rle{2}(d_rle{1}==1);
toc

経過時間は 0.002632 秒です。

tic
q = [0 diff([0 d 0] == 2)];
find(q == -1) - find(q == 1);
toc

経過時間は 0.003061 秒です。

于 2011-10-21T18:52:06.787 に答える
-1

連続した値が配置されている元の行列のインデックスが必要な場合はどうなるでしょうか? さらに、連続する値の数が連続する値のインデックスに格納されている、元の行列と同じサイズの行列が必要な場合はどうなるでしょうか? 例えば:

  original_matrix = [1 1 1;2 2 3; 1 2 3];

  output_matrix = [3 3 3;2 2 0;0 0 0];

この問題は、気象データの品質管理に関連しています。たとえば、多数のセンサーからの温度データのマトリックスがあり、一定の連続値を持つ日と一定の日数を知りたい場合、データに障害の可能性があるというフラグを立てることができます。

温度マトリックスは日数 x ステーション数であり、出力マトリックスも日数 x ステーション数であり、上記のように連続した値にフラグが付けられます。

于 2014-11-09T09:36:56.420 に答える