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)