2014-09-02 78 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. 刪除循環中向量的元素時,從末尾循環到開始,而不是從開始到結束,這是一種常見的技術。然後你的代碼工作得很好。