2014-09-02 52 views
6

假设我有数据: x = [3,3,1,1,1,2,2,1,1,1,1]
我想有输出:
y = [3,1,2,1]
以独特的()函数,我可以得到:
z = [3,1,2]模拟独特的功能,保持秩序和重复的(MATLAB)

但是,正如你所看到的,我最后错过了'one'。 所以,我试图写一个循环,但没有做我应该做的事情。 我期待它删除一个重复的值,循环应该确保只剩下一个值。然而,该输出是:
X = [3,3,1,1,2,1,1]
环路:
for i=1:length(x)
if x(i)==x(i+1)
x(i)=[];
end;
end;
是否有一个如何在y中生成输出?我的循环中的错误在哪里?

回答

5

如果你希望有一个无环路的方法 -

y = x([1 diff(x)~=0]==1) 

或者

y = x([1 abs(diff(x))]>0) 

或者

y = x([1 diff(x)]~=0) 
+0

哇。多么简单和好的解决方案!非常感谢你! – user3349993 2014-09-02 15:57:31

+3

@ user3349993其中一些我从[Luis](http://stackoverflow.com/users/2586922/luis-mendo)了解到。看看他的东西! – Divakar 2014-09-02 15:58:31

+3

很好的答案。并感谢提及! :-) – 2014-09-02 16:26:25

2

提出您的问题还要求,凡在你的代码中的错误是,这就是答案。这里说到你的代码,其工作方式的变化:

x = [3,3,1,1,1,2,2,1,1,1,1]; 
for i=length(x):-1:2 
    if x(i)==x(i-1) 
     x(i)=[]; 
    end; 
end; 
  1. 在你的循环i从1到length(x)。在最后一次迭代中没有i+1元素,因为i已经等于length(x)
  2. 删除循环中向量的元素时,从末尾循环到开始,而不是从开始到结束,这是一种常见的技术。然后你的代码工作得很好。