我想在向量中找到一系列相等元素的第一个元素。 例如,我有
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);
(正如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的答案可能更优雅。