MATLAB中将细胞数组的所有维度从小到大排序

3

我创建了一个大小为(10,5)的单元数组,名为Items。它的第一列包含以下内容:

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

我已经将所有单元格填满,但我需要按欧元总价从小到大的顺序对单元格数组进行排序,但似乎找不到方法。我尝试使用sort(Items,5);根据欧元价值进行排序,但它返回错误。如果我想添加更多项目,自动排序可能很有用,这样它们仍然会在全局列表中排序。

你的单元数组是否只是一个矩阵,其中顶部行是标题,其余是数字?无论如何,请查看sortrows函数。 - MZimmerman6
在第一列中,我有项目名称(字符串)。 - Marta Sampietro
2个回答

3

sortrows很可能会完全满足您的需求。它将基于特定列进行排序,假设整个列中的数据类型是恒定的。

>> 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]

编辑

从下面的评论中可以看出,你可以先对数组进行排序,然后以与组合常规数组相同的方式向单元格数组添加一行。文档

>> 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]

编辑 #2

您可以使用round函数的第二个参数来四舍五入要呈现的值。在进行四舍五入后,您可以更改显示方式的格式。通常设置为short,即4位小数。如果将其设置为shortg,则会尽可能显示少量小数,最多不超过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

如果更改格式不是一个选项,您可以将数字转换为字符串,然后显示它。这会变得有点复杂,但快速谷歌搜索会帮助您解决问题。
编辑 #3
我以前不知道这个存在,但显然您可以使用格式style称为bank。即使它们为0,这将显示所有数字为两个小数点。

你的方法很好用。顺便问一下,你是怎么给列加标题的?有特定的方法吗,还是只需要在第一行单元格里填写即可? - Marta Sampietro
@MartaSampietro 使用 table 类或将字符串行放置为您的单元数组的第一列。 - rayryeng
@MartaSampietro 是的,先对单元格数组进行排序,然后再添加名称。像这样做就可以了:names = {'项目名称','价格(美元)','运费(美元)','总价(美元)','总价(欧元)'}; asorted = [names; asorted]; 首先创建一个名称单元格数组作为单行,然后将此名称单元格数组连接到已排序数组的顶部。 - rayryeng
@MartaSampietro 编辑已添加到我的答案中,解释了你所需要的内容。请记得接受一个答案,以便未来搜索问题的人知道哪个答案解决了你的问题。 - MZimmerman6
@MZimmerman6 很好,现在它运行得非常好!只是稍微挑剔一下,有没有办法让列表上的数字仅保留两位小数?例如 17.48、9.95 或在免费发货的情况下为0.00?最终我将使用 disp(Items) 来显示表格,因此希望所有数字都具有相同的格式。 - Marta Sampietro
显示剩余4条评论

2

首先将所有价格放入一个单独的数组中,对该数组进行排序,然后使用排序的索引来重新排列您的单元格数组的行。

可以尝试以下方法:

price = [Items{:,5}];
[~,ind] = sort(price);
ItemsSorted = Items(ind,:);

或者您可以使用MZimmerman6提到的 sortrows 函数,并沿着您的单元格数组的第五列进行操作。我之前不知道它可以用于单元格数组,所以我学到了新东西!


1
很高兴能教你一些新东西 :) 我几个月前才学到这个。虽然替代方案只多了一两行,但简洁几乎总是好的。 - MZimmerman6
@MZimmerman6 我不知道它可以在单元数组上使用,所以我毫不犹豫地使用了它。谢谢你的窍门! - rayryeng
1
没问题,据文档所述,它甚至可以在表格上工作。 - MZimmerman6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接