检测向量的变化

时间:2013-09-23 16:06:47

标签: matlab vector

我想在向量中找到一系列相等元素的第一个元素。 例如,我有

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];

由于

4 个答案:

答案 0 :(得分:3)

这适用于这种特殊情况:

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

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

(正如Praetorian所指出的那样,最后一个可以更加整洁地表达

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

节省您使用abs

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

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

也有效

答案 1 :(得分:2)

您可以使用

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

答案 2 :(得分: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)。

答案 3 :(得分: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 Hard的答案可能更优雅。