文件交换的选择

我们最好的用户提交

基于字段排序结构数组

汪东城本周的选择嵌套的结构体类型通过杰克Hughey

MATLAB具有一个不错的功能sortrows排序矩阵(数字或细胞)基于特定的列(s)。我经常用它当我做一些数据管理。如果你有统计工具箱,有相应的功能数据集的数组有序数组

有时候,我想做一个类似的行动结构数组。我希望能够根据特定的字段。为了做到这一点,它需要一些数据操作。让我们看一个例子。

一个=结构(“名字”,{“迈克”,“豆豆”,“史蒂夫。”,“罗兰”,汪东城的,布雷特的,“赛斯”},“年”、{2005,2001,1993,1987,2006,2005,1998},“天”,{“我的”,“星期五”,“结婚”,“星期五”,“我的”,“我的”,“我的”})id = 1:长度(A)流(“% d \ n”(id) disp (id))结束
= 1×7结构体数组字段:名称年第一天的名字:“迈克”:2005天:“星期一”2名:‘道’:2001天:“星期五”3名:“史蒂夫的一年:1993天:“结婚”4名:“罗兰”:1987天:“星期五”5名:“汪东城”:2006天:“星期一”6名:“布雷特”:2005天:‘我的’7名:“赛斯”:1998天:‘我的’

让我们排序的数组字段“name”。首先,您需要转换为一个单元阵列:

在远处=字段名(A);Acell = struct2cell(一个);深圳=大小(Acell)%注意,这是一个三维数组。%与P (MxN结构数组字段,大小%的转换单元阵列PxMxN
深圳= 3 1 7

一旦单元阵列,您就可以使用sortrows:

%转换为一个矩阵Acell =重塑(Acell,深圳(1),[]);% Px(麦根)%让每个字段列Acell = Acell ';%(麦根)xP%排序第一个字段“名称”Acell = sortrows (Acell, 1)
Acell = 7×3单元阵列{布雷特的}{[2005]}{‘我的’}{‘道’}{[2001]}{“星期五”}{汪东城的}{[2006]}{‘我的’}{“罗兰”}{[1987]}{“星期五”}{“迈克”}{[2005]}{‘我的’}{“塞斯”}{[1998]}{‘我的’}{史蒂夫的}{[1993]}{‘结婚’}

并将其转换回一个结构数组:

%放回原始单元阵列格式Acell =重塑(Acell”,深圳);%转换为结构体带点= cell2struct (Acell地区1);id = 1:长度(带点)流(“% d \ n”id) disp(带点(id))结束
1名:“布雷特”:2005天:“星期一”2名:‘道’:2001天:“星期五”3名:“汪东城”:2006天:“星期一”4名:“罗兰”:1987天:“星期五”5名:“迈克”:2005天:“星期一”6名:“赛斯”:1998天:‘我的’7名:“史蒂夫的一年:1993天:“结婚”

更简单的方法

你想要一个更简单的方法吗?只使用杰克的nestedSortStruct:

B = nestedSortStruct (A,“名字”);isequal (B,带点)
ans =逻辑1

你甚至可以由多个字段排序。例如,让我们按“年”排序,然后通过“名字”:

C = nestedSortStruct (A, {“年”,“名字”});id = 1:长度(C)流(“% d \ n”id) disp (C (id))结束
1名:“罗兰”:1987天:“星期五”2名:“史蒂夫的一年:1993天:“结婚”3名:“赛斯”:1998天:‘我的’4名称:‘道’:2001天:“星期五”5名:“布雷特”:2005天:“星期一”6名:“迈克”:2005天:‘我的’7名:“汪东城”:2006天:‘我的’

杰克,谢谢你这个条目。我的一个建议就是帮助文本中包括几个例子代码。

编辑(R2017a)

从R2017a,您可以使用sortrows与表清洁、高效地完成一个类似的任务。

Atable = struct2table(一个);Atable_sorted = sortrows (Atable,“名字”)
Atable_sorted = 7×3表名____年____天____{布雷特的}2005{‘我的’}{‘道’}2001{“星期五”}{汪东城的}2006{‘我的’}{“罗兰”}1987{“星期五”}{“迈克”}2005{‘我的’}{“塞斯”}1998{‘我的’}{史蒂夫的}1993{‘结婚’}

评论

试一试了,等我们知道你的想法在这里或者离开评论杰克。




发表与MATLAB®R2020b

|
  • 打印
  • 发送电子邮件

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。