2016-05-11 51 views
1

我有一個n -by- 1載體其中n = 20000。我想爲這個向量中的數據做一個十分位的排名,這個排名基本上是用相應的十分位數來替換每個元素的值。Matlab中的分位數排序

我目前做這種方式:

deciles = quantile(X,9); 
X = discretize(X,[-inf deciles inf]); 

哪裏X是我的數據陣列。我這樣做是因爲我想在每個數據組中使用相同數量的10組數據。

你能驗證這個程序嗎?或者讓我知道是否有更健壯的方法來做到這一點?

+0

你可以很容易地驗證這一點 - 只需構造一個小樣本'X',看看你是否得到了正確的結果。我立即建議的一件事就是不要在原地做這件事。即不要重寫'X',而是創建一個新的變量,比如'X_dec',這樣你就可以將它與'X'進行比較,這將有助於你自己驗證你的程序 – Dan

+0

是的,我已經做到了,它工作正常一個小樣本。但是有時當用於龐大的數據集時,有些東西可能會出錯!只是想聽聽其他人是否有意義,或者有其他方法可以做到這一點!但感謝評論! – Tulkkas

回答

1

通過創建已知大小的簡單數據,您可以輕鬆驗證您擁有的是否正確。

nGroups = 10; 
nPerGroup = 10000; 

X = linspace(0, 1, nGroups * nPerGroup); 

deciles = quantile(X, nGroups - 1); 
X = discretize(X,[-inf deciles inf]); 

nPerGroup = arrayfun(@(x)sum(X == x), 1:nGroups) 
%// 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 

另一種選擇是你的數據,而不是進行排序,然後重塑,使列數爲所需的組數。此方法僅依靠內置功能

X = linspace(0, 1, nGroups * nPerGroup); 
Y = reshape(sort(X), [], nGroups); 

然後每列都是不同的組。