Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 删除重复项-**仅当重复项按顺序出现时_Matlab_Vector_Duplicates_Sequence - Fatal编程技术网

Matlab 删除重复项-**仅当重复项按顺序出现时

Matlab 删除重复项-**仅当重复项按顺序出现时,matlab,vector,duplicates,sequence,Matlab,Vector,Duplicates,Sequence,我想做一些类似于下面的事情,只是我只想删除'g'和'g',因为它们是一个接一个出现的重复项。我还想保持序列不变 任何帮助都将不胜感激 我在MATLAB中有一个单元阵列: y = { 'd' 'f' 'a' 'g' 'g' 'w' 'a' 'h'} ans = 'd' 'f' 'a' 'w' 'a' 'h' 我的第一个答案(如下)在多个副本上使用时出错(谢谢grantnz)。以下是更新版本: >> y = { 'd' 'f' 'a' 'g' 'g' 'w' '

我想做一些类似于下面的事情,只是我只想删除'g'和'g',因为它们是一个接一个出现的重复项。我还想保持序列不变

任何帮助都将不胜感激

我在MATLAB中有一个单元阵列:

y = { 'd' 'f' 'a' 'g' 'g' 'w' 'a' 'h'}


ans =

'd'    'f'    'a'    'w'    'a'    'h'

我的第一个答案(如下)在多个副本上使用时出错(谢谢grantnz)。以下是更新版本:

>> y = { 'd' 'f' 'a' 'g' 'g' 'w' 'a' 'h' 'h' 'i' 'i' 'j'}; >> i = find(diff(char(y)) == 0); >> y([i; i+1]) = [] y = 'd' 'f' 'a' 'w' 'a' 'j' >>y={'d''f''a''g''g''w''a''h''h''i''i''j'}; >>i=find(diff(char(y))=0; >>y([i;i+1])=[] y= “d”“f”“a”“w”“a”“j”
旧答案

如果“单元向量”始终仅包含单个字符元素,则可以执行以下操作:

>> y = { 'd' 'f' 'a' 'g' 'g' 'w' 'a' 'h'} y = 'd' 'f' 'a' 'g' 'g' 'w' 'a' 'h' >> y(find(diff(char(y)) == 0) + [0 1]) = [] y = 'd' 'f' 'a' 'w' 'a' 'h' >>y={'d''f''a''g''g''w''a''h'} y= “d”“f”“a”“g”“g”“w”“a”“h” >>y(find(diff(char(y))==0)+[01])=[] y= “d”“f”“a”“w”“a”“h”
这样看:您希望保留一个元素,当且仅当(1)它是第一个元素,或者(2)它的前一个元素与它不同,或者(3)它是最后一个元素,或者(4)它的后继元素与它不同。因此:

y([true ~strcmp(y(1:(end-1)),y(2:end))] & [~strcmp(y(1:(end-1)),y(2:end)) true])
或者,也许更好

different = ~strcmp(y(1:(end-1)),y(2:end));
result = y([true different] & [different true]);
这应该起作用:

 y([ diff([y{:}]) ~= 0 true])
或者稍微紧凑一点

 y(diff([y{:}]) == 0) = []
更正:上述方法无法同时删除两个副本

ind = diff([y{:}]) == 0;
y([ind 0] | [0 ind]) = []
顺便说一句,即使存在多个重复序列,这种方法也有效

例如


欢迎来到StackOverflow。如果没有“matlab”标签,“vector”、“duplicates”和“sequence”标签将一文不值。你不是在找病媒专家。您正在寻找matlab专家。此解决方案不太符合问题的要求。在连续重复的情况下,这两个元素都应该删除。哎呀,你说得对:我误解了这个问题。现在已修复(因此,我担心您的评论对未阅读此内容并意识到我已编辑了答案的任何人都没有意义;抱歉)。此解决方案不会按要求删除两个副本。您是否尝试过使用多个副本的解决方案?我想你会得到一个“矩阵尺寸必须一致”的错误。谢谢!他们似乎都工作得很好。修改此代码以删除三个副本是否容易?是否可以使用i、i+1和i+2之间的差值或类似的值?>>y={'d'f''a''g''g''g''w''a''h''h''i''i''j'};>>i=find(diff(char(y))==0;>>y([i;i+1])=[]@jess:是的,这种方法可以像处理任何数量的连续副本一样工作。太好了。非常感谢!我想我开始明白其中的逻辑了。
y = { 'd' 'f' 'a' 'g' 'g' 'w' 'a' 'h' 'h'};
ind = diff([y{:}]) == 0;

y([ind 0] | [0 ind]) = []

y = 

     'd'    'f'    'a'    'w'    'a'