2013-09-23 47 views
3

我想找到矢量中一系列相等元素的第一个元素。 比如我有检测矢量中的变化

V = [1 2 2 2 3 3 3 4 4 2 2 3 3 4 4] 

我的结果应该是

R = [1 2 3 4 2 3 4] 

不幸的是我不能使用unique,因为它会给我

R = [1 2 3 4]; 

感谢

+0

我已经添加了您的载体可以包含无限值的更一般的情况下的解决方案。 –

回答

3

这适用于这个特殊情况:

R=V(find(diff([-Inf V]))); 

R=V(abs(diff([-Inf V]))>0); 

(最后一个,由裁判官指出,可以表示更整齐的

R=V(diff([-Inf V])~=0); 

节省您使用的abs

最后,如果你想非常合乎逻辑,

R=V(~~diff([-Inf V])); 

也适用

+5

或使用逻辑索引:'R = V(diff([ - Inf V])〜= 0)' – Praetorian

0

你可以做到这一点相当粗制滥造这样的:

V = [ 1 2 2 2 3 3 3 4 4 2 2 3 3 4 4 ]; 
W = [-Inf V(1:size(V)(2)-1)]; 
X = V - W; 
Y = find(X); 
Z = V(Y); 

但我认为@Try硬的答案可能是更优雅。

1

广义解

如果您的载体可以包含无限值,这里是你如何对待它,如果你考虑到无限的值作为其存储值:

V = [-Inf Inf Inf 1 2 2 2 3 3 3 4 4 2 2 3 3 4 4 Inf -Inf -Inf Inf]; 

idx = [true ~isnan(diff(V))]; 
R = V(idx); 
R([true logical(diff(R))]) 

结果将是:

-Inf Inf  1  2  3  4  2  3  4 Inf -Inf Inf 

当然这也适用于简单情况。

一般而言,您的向量也可能包含NaN值,在这种情况下,我会推荐另一个准备步骤,以便使用isnan删除此值。


原来的答复

为相同的基本问题的另一种简单的解决方案:而不是让你需要什么,请删除不需要的东西。

R = V; 
R(~diff([-Inf R]))=[]; 

如果你只是想'清理'你的变量,你只需要一行。

如果性能问题,我敢打赌其他解决方案之一(没有find)。

2

您可以使用

R=V([logical(diff(V)), true]);