# Matlab - Sort into deciles each column

18 views (last 30 days)
V on 4 Dec 2015
Edited: René Wijnen on 30 Jul 2021
Suppose I have a matrix A [m x 1], where m is not necessarily even. I to create a matrix B also [m x 1] which tells me the decile of the elements in A (i.e. matrix B has numbers from 1 to 10).
I know I can use the function sort(A) to get the position of the elements in A and from there I can manually get deciles. Is there another way of doing it?
I think one possibility would be B = ceil(10 * tiedrank(A) / length(A) . What do you think? Are there any issues with this?
Also, more generally, if I have a matrix A [m x n] and I want to create a matrix B also [m x n], in which each column of B should have the decile of the corresponding column in A , is there a way of doing it without a for loop through the columns?
Hope the problem at hand is clear. So far I have been doing it using the sort function and then manually assigning the deciles, but it is very inefficient.
Thank you

jgg on 4 Dec 2015
I think a way to do this is to use the ecdf command (<http://www.mathworks.com/help/stats/ecdf.html>)
• If you take your data and do [F,X] = ecdf(A) then this will compute the empirical distribution of A.
• You then just have to match the values in A to those in X which you can do using ismember like this [~,loc] = ismember(X,X2)
• Finally, your quantiles of the values in A will be f(loc)
• You can then sort them into deciles, or whatever you want at that point by rounding to the appropriate value.

René Wijnen on 30 Jul 2021
Edited: René Wijnen on 30 Jul 2021
I would use the following to split a vector X into deciles:
X_dec = discretize(X,quantile(X,[0:10]/10))
Works as well for each column of an array X