2014-02-24 32 views
1

有沒有一種方法可以讓accumarray每個觀察除了每個組的最後一個?Accumarray如何設置「樂趣」只使用每個bin的最後一個obs

我腦子裏想的是什麼類似的東西:

lastobs=accumarray(bin,x,[],@(x){pick the observation with the max index in each group}; 

給你舉個例子,假設我有以下幾點:

bin=[1 2 3 3 3 4 4]; %#The bin where the observations should be put 
x= [21 3 12 5 6 8 31]; %#The vector of observations 
%#The output I would like is as follow 
lastobs=[21 3 6 31]; 

我其實想的accumarray只是因爲我只是用它來計算每個箱的觀測值的平均值。所以每一個可以製造這個技巧的功能對我來說都會很好。

回答

4

當然你可以用accumarray來做到這一點。 x(end)是數組中的最後一個觀察值。請注意,需要對bin進行排序以使其起作用,因此如果不是,請首先運行 [bin,sortIdx]=sort(bin);x = x(sortIdx);

lastobs = accumarray(bin(:),x(:),[],@(x)x(end)); %# bin, x, should be n-by-1 
+0

謝謝喬納斯,我仍然與索引混亂。我嘗試了很多組合,但不是最簡單的組合!很高興你永遠在場,以幫助 – Gio

+0

對於未來的讀者:'bin'需要進行排序才能正常工作! – knedlsepp

+0

@knedlsepp:不,「bin」可以是任何順序,只要它的順序對應於'x'中元素的順序即可。或者你可以舉一個例子,它不起作用? – Jonas

2

你已經得到了你的accumarray的答案,但因爲你正在尋找的任何解決方案,將做的工作,考慮unique下面的應用程序。

使用unique'legacy'期權賦予最後發生時的各值的指標,因爲你需要:

>> [~,ia] = unique(bin,'legacy') 
ia = 
    1  2  5  7 
>> lastobs = x(ia) 
lastobs = 
    21  3  6 31 

現在,我accumarray,這裏多少人知道,但我實際上更喜歡這個解

+0

謝謝chappjc,我對matlab很新,每一個答案都是我可以學習的東西。無論如何,我明天會和最大的系列一起工作,我會檢查兩個解決方案,看看哪一個是最快的。再次感謝您的回答。 – Gio

+0

@Gio'accumarray'在大多數情況下是非常快速的,但也許有了這個特定的「樂趣」,它可能會慢一點。 – chappjc

+0

@chappjc:是的,這是一個很好的使用'獨特'。 +1 – Jonas

相關問題