Matlab 删除彼此相邻的重复项,但如果以后再次出现,则保留该重复项
我有一个向量,看起来像这样:Matlab 删除彼此相邻的重复项,但如果以后再次出现,则保留该重复项,matlab,duplicates,Matlab,Duplicates,我有一个向量,看起来像这样: v=[1 2 2 3 3 2 1] 也就是说,相等元素的数量可以变化,但它们总是按1逐步增加和减少 我想要的是一个简单的方法,留下一个新的向量,如下所示: v2=[12321] 保存所有不同的元素(按照它们在v中出现的正确顺序),但每个元素只保留一个。最好不要循环,因为通常我的向量大约有10000个元素长,并且已经在一个循环中运行了 非常感谢您的回答 您可以尝试使用diff,对于向量X,它返回[X(2)-X(1)X(3)-X(2)…X(n)-X(n-1)](键入帮助
v=[1 2 2 3 3 2 1]代码>
也就是说,相等元素的数量可以变化,但它们总是按1逐步增加和减少
我想要的是一个简单的方法,留下一个新的向量,如下所示:
v2=[12321]代码>
保存所有不同的元素(按照它们在v
中出现的正确顺序),但每个元素只保留一个。最好不要循环,因为通常我的向量大约有10000个元素长,并且已经在一个循环中运行了
非常感谢您的回答 您可以尝试使用diff
,对于向量X
,它返回[X(2)-X(1)X(3)-X(2)…X(n)-X(n-1)]
(键入帮助diff
,了解此函数的详细信息)。因为向量中的元素总是增加或减少1,那么
diff(v)
将是一个向量(大小小于v
),带有0和1,其中1表示上升或下降。我们可以忽略所有的零,因为它们意味着重复的数字。我们可以将其转换为逻辑数组,如下所示
logical(diff(v))
这样我们就可以索引到v
并访问它的元素
v(logical(diff(v)))
返回
1 2 3 2
这几乎是你想要的,只是没有最后的数字,可以添加为
[v(logical(diff(v))) v(end)]
试试上面的方法,看看会发生什么 您可以尝试使用diff
,对于向量X
,它返回[X(2)-X(1)X(3)-X(2)…X(n)-X(n-1)]
(键入帮助diff
,了解此函数的详细信息)。因为向量中的元素总是增加或减少1,那么
diff(v)
将是一个向量(大小小于v
),带有0和1,其中1表示上升或下降。我们可以忽略所有的零,因为它们意味着重复的数字。我们可以将其转换为逻辑数组,如下所示
logical(diff(v))
这样我们就可以索引到v
并访问它的元素
v(logical(diff(v)))
返回
1 2 3 2
这几乎是你想要的,只是没有最后的数字,可以添加为
[v(logical(diff(v))) v(end)]
试试上面的方法,看看会发生什么 您可以使用它。你真正需要的是:删除任何与前面的元素相等的元素
diff
返回向量中所有相邻元素之间的差值。如果没有差异,它将返回0
v(ind~=0)
将为您提供值不同于零的所有元素。开头的1
是为了确保第一个元素被计数。由于diff
返回元素之间的差异,numel(diff(v))=numel(v)-1
v = [1 1 2 2 2 3 3 3 3 2 2 1 1 1];
ind = [1 diff(v)];
v(ind~=0)
ans =
1 2 3 2 1
当然,如果您愿意,这可以在一行中完成:
v([1, diff(v)]~=0)
你可以用这个。你真正需要的是:删除任何与前面的元素相等的元素
diff
返回向量中所有相邻元素之间的差值。如果没有差异,它将返回0
v(ind~=0)
将为您提供值不同于零的所有元素。开头的1
是为了确保第一个元素被计数。由于diff
返回元素之间的差异,numel(diff(v))=numel(v)-1
v = [1 1 2 2 2 3 3 3 3 2 2 1 1 1];
ind = [1 diff(v)];
v(ind~=0)
ans =
1 2 3 2 1
当然,如果您愿意,这可以在一行中完成:
v([1, diff(v)]~=0)