2011-10-21 66 views
6

如果有人向我展示了一个简单的方法来做到这一点,我将不胜感激。假设我在MATLAB中有一个向量,就像连续数字系列(不同长度)

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

我想要查找连续数字“2”的序列以及这些序列的长度。

可以通过x=find(d==2)轻松找到数字2。但我要的是得到它包含了所有一系列连续数三三两两的长度的向量,这意味着我的成绩在这种情况下会是这样一个向量:

[1 3 1 5 1]. 

任何人谁可以帮我?

+0

相关问题:[MATLAB:查找序列中零的岛屿](http://stackoverflow.com/questions/3274043/matlab-finding-islands-of-zeros-in-a-序列) – Amro

回答

9

这似乎工作:

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

v = 

    1 3 1 5 1 

+0

非常好。 ------- –

+0

非常感谢,这似乎解决了我的问题! :) – alex

+0

如果v不是矢量而且是动态的呢?如果成功的次数是连续5次,那么胜利?你能帮忙@MAX – pac

6

这就是所谓的运行长度编码。在http://www.mathworks.com/matlabcentral/fileexchange/4955-rle-deencoding有一个很好的m文件可用。这种方法通常比以前发布的差异/查找方式更快。

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秒。

+0

Yep - rle()只有一个调用find()和find()很慢 – Max

+0

@Max整洁...我从来没有打开它找出原因。谢谢! –

+0

谢谢你的回答,以及:)! – alex

-1

如果我们想要连续值所在的原始矩阵的索引,该怎么办?此外,如果我们想要一个与原始矩阵大小相同的矩阵,那么连续值的数量存储在连续值的索引中?例如:

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

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

此问题与气象数据质量控制有关。例如,如果我有许多传感器的温度数据矩阵,并且我想知道哪些日子具有恒定的连续值,并且有多少天保持不变,那么我可以将数据标记为可能有缺陷。

温度矩阵是天数×站数,我想要一个输出矩阵也是天数×站数,其中连续值如上所述标记。