Search code examples
matlabsortingcell-array

Sort all dimensions of a cell array from min to max in MATLAB


I have created a cell array called Items of size (10,5). It contains the following as the first column in the cell array:

Item name    Price (in $)    Shipping (in $)    Total price (in $)    Total price (in €)

I have it all filled up, but what I need to do is to sort the cell array according to the total price in € from the smallest to the largest, but I can't seem to find a way to do it. I tried sort(Items,5); in order to sort according to the values in € but it returns an error. It could be useful to find a way to make the sorting automatic, so if I wanted to add more items it would still sort them in the global list.


Solution

  • sortrows will likely do exactly what you want to do. It will sort based on a specific column, assuming the datatype is constant in the entire column.

    >> a ={'a',8,9;'b',5,6;'c',2,3};
    >> a_sorted = sortrows(a,3)
    
    a_sortred = 
    
    'c'    [2]    [3]
    'b'    [5]    [6]
    'a'    [8]    [9]
    

    Edit

    From your comments below, you can easily just sort the array first and then add a row to the cell array the same way you would combine regular arrays. Documentation

    >> a = {7,8,9;4,5,6;1,2,3};
    >> a_sorted = sortrows(a,3);
    >> headers = {'col1','col2','col3'};
    >> a_header = [headers;a_sorted]
    
    a_header = 
    
        'col1'    'col2'    'col3'
        [   1]    [   2]    [   3]
        [   4]    [   5]    [   6]
        [   7]    [   8]    [   9]
    

    EDIT #2

    You can round the values that you are presenting using the second argument of the round function. After you round it, you can change the format of how things are displayed. Normally it is set as short, which is 4 decimal places. If you set it to shortg it will show as few decimals as possible, up to 4.

    >> a = [1.23456789;2.3456789;3.456789]
    
    a =
    
        1.2346
        2.3457
        3.4568
    
    >> a_rounded = round(a,2)
    
    a_rounded =
    
        1.2300
        2.3500
        3.4600
    
    >> format shortg
    >> a_rounded
    
    a_rounded =
    
             1.23
             2.35
             3.46
    

    If changing the format is not an option, you could always just convert the number into a string and then display that. That gets a little more complicated, but a quick google will help you there.

    EDIT #3

    I did not know this existed before, but you can apparently use the format style called bank. This will display all numbers as two decimal points even if they are 0.