我想在向量中找到一系列相等元素的第一个元素。例如我有
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];
谢谢
这适用于这种特殊情况:
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]));
也有效
您可以使用
R=V([logical(diff(V)), true]);
广义解决方案
如果您的向量可能包含无限值,那么如果您将无限值视为其存储值,则可以通过以下方式处理它:
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
)。
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.