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

谢谢

4

4 回答 4

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

也有效

于 2013-09-23T16:11:53.430 回答
2

您可以使用

R=V([logical(diff(V)), true]);
于 2013-09-23T18:20:33.403 回答
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)。

于 2013-09-23T16:34:10.970 回答
0

You can do it fairly crudely like this:

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

but I think @Try Hard's answer is probably more elegant.

于 2013-09-23T16:19:45.190 回答