从结构体到数据集
当我上周五上班的时候,我看到一个电子邮件讨论,代表一个客户,试图找到一个好的方法来添加一个新的字段到结构体数组中。所以这篇文章将从这个问题开始,然后展示一种不同的方法来收集相同的信息,在a数据集数组中。
内容
初始结构和新数据
让我们创建一些信息来存储在a中结构体。
名称= {“约翰。”;“亨利。”};年龄= {26;18个};init = struct()“名字”、名称、“年龄”、年龄);
请注意年龄数据是一个单元格数组。除了…之外名字和年龄,我有。高度数字而非单元格数组中的信息。
身高= [168;175);
如何将此信息添加到我的结构体?接下来是一系列的可能性,当然不是详尽的!
First Pass - for循环
我们从a开始为循环。的每个元素都添加了Height信息结构体数组,一次一个。
S1 = initS;为index = 1:长度(S1) S1(索引)。Height = Height (index);结束
第二关- arrayfun
我可以用arrayfun去除循环。
S2 = initS;F = @(S,h) setfield(S,“高度”、h);S2 = arrayfun(F, S2, height);
第三通-交易
如果数据在单元格数组中,我可以轻松地将其分配到多个输出。这里我将高度数据存储在一个单元格中交易出来。
S3 = init;cH = num2cell(height);(S3。[Height] = deal({:});
第四步-逗号分隔列表
如果数据已经在单元格数组中,我可以跳过这一步交易把不同的细胞分配到不同的输出。
S4 = initS;cH = num2cell(height);(S4。[size] = {:};
相同的结果吗?
让我们快速检查每种技术是否得到相同的结果。
allsame = isequal(S1,S2,S3,S4)
Allsame = 1
数据是什么样的?
这里的数据很难看,例如,S1),因为每一个的内容结构体元素完全由用户支配。所以我可以一次查看一个数组元素。
S1 (1)
ans =姓名:'John'年龄:26身高:168
或者我可以一次查看单个字段中的所有数据。
(S1。年龄)
Ans = 26 18
但我看不见所有对数据一目了然。
完全不同的观点
现在是完全不同的东西。我之前在博客中写道关于数据集数组的统计工具箱。下面是另一个可能有用的例子。我将列视为单独的字段,将行视为单独的记录。每列包含一种数据类型的数据。这是数据。
名称= {“约翰。”;“亨利。”} ages = [26;18];D1 = dataset({names,“名字”},{年龄,“年龄”})
names = 'John' 'Henri' d1 = Name Age 'John' 26 'Henri' 18
与使用a相比,这里需要注意两点结构体包含信息。首先,参数在两个解中以不同的顺序出现。金宝搏官方网站第二,数值数据不需要放在单元格数组中数据集,使数据管理更自然,在我看来。
让我用额外的数据做一个新的数据集,高度。
D2 = dataset({names,“名字”}, {[168;175]“高度”})
d2 =名字身高'John' 168 'Henri' 175
连接数据集数组
现在让我收集原始数据集d1有了新的信息d2。以下是实现这一目标的一些方法。首先,使用方括号([]),就像处理常规数组连接一样。
Dnew1 = [d1 d2]
dnew1 =姓名年龄身高'John' 26 168 'Henri' 18 175
另一种方法是在a中添加信息结构体就像回到原来的样子数据集。
Dnew2 = d1;dnew2。身高= [168;175]
dnew2 =姓名年龄身高'John' 26 168 'Henri' 18 175
现在我们来改变一下数据集有了新的信息,但是交换了两个项的顺序。
D3 = dataset({{“亨利。”;“约翰。”},“名字”}, {[175;168]“高度”})
d3 =名字高度'Henri' 175 'John' 168
如果我们试图收集会发生什么d1和d3合而为一数据集?
试一试Dnew3 = [d1 d3];抓ExcDataset disp (ExcDataset.message)结束
具有不同数据的重复变量名。
正如你所看到的,我不能通过连接将它们收集在一起。但是,我可以结合或加入这两个数据集正确。
Dnew3 = join(d1,d2,“名字”)
dnew3 =姓名年龄身高'John' 26 168 'Henri' 18 175
注意,我可以很容易地一次看到所有的数据,与结构体数组中。
你如何安排你的数据?
你是否使用这两种策略来安排你的资料?结构体或数据集数组)?或者你会做一些不同的事情?我很想听听你的经历在这里。