# Question about sorting an array column by column

4 views (last 30 days)
helen orins on 27 Sep 2021
Commented: helen orins on 27 Sep 2021
I need to sort each column of a 1073x15 array for a heatmap in MATLAB.
[~,sortdices] = sort(choose_data(:,1),'ascend');
%choose_data = choose_data(:,sortdices);
for i=1:15
choose_data(:,i) = choose_data(sortdices,i)
end
this is my code. choose_data is the 1073x15 array. My output ends up being the first column sorted in ascending order, but the rest not. How do I fix it, such that all columns are sorted in ascending order? (Thank you for any help!)
##### 2 CommentsShowHide 1 older comment
helen orins on 27 Sep 2021
Each column is sorted independently. So column 1, in ascending order. Done. Next, column 2, and so on. Hence the loop. So that's why I created the function. The rows are untouched.

the cyclist on 27 Sep 2021
Edited: the cyclist on 27 Sep 2021
choose_data = sort(choose_data)
will sort every column independently. Ascending sorting is the default, so you don't need to specify that. (But it also doesn't hurt, and might make the code clearer.)
##### 2 CommentsShowHide 1 older comment
the cyclist on 27 Sep 2021
Strange. Here is an example that illustrates that the syntax works:
M = magic(3)
M = 3×3
8 1 6 3 5 7 4 9 2
M = sort(M)
M = 3×3
3 1 2 4 5 6 8 9 7
Note that you do not need to do anything in a for loop. That one line of code will sort all columns of the array. You also don't need to do any indexing into the array.

Steven Lord on 27 Sep 2021
Specify the dim input argument to the sort function.
A = magic(5)
A = 5×5
17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9
B = sort(A, 1)
B = 5×5
4 5 1 2 3 10 6 7 8 9 11 12 13 14 15 17 18 19 20 16 23 24 25 21 22
% Compare with
C = sort(A, 2)
C = 5×5
1 8 15 17 24 5 7 14 16 23 4 6 13 20 22 3 10 12 19 21 2 9 11 18 25
If you want to sort one of the columns and have the rest of the rows rearrange correspondingly see the sortrows function.
D = sortrows(A, 2) % sort by column 2
D = 5×5
23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 17 24 1 8 15