MATLAB的两个内建函数:把结构体数组转换成元胞数组的struct2cell,把元胞数组转换为结构体数组(或者叫结构体向量)的cell2struct。
先贴一下官方文档:https://ww2.mathworks.cn/help/matlab/ref/struct2cell.html
https://ww2.mathworks.cn/help/matlab/ref/cell2struct.html
目录
文档的解释和示例都很详细了,记录一下自己在把struct和cell来回转换的过程中遇到的问题,包括一些书上的名称和文档中不同的细节。
一、从struct到cell
1. struct2cell文档中的 “c = struct2cell(s)
将 m
×n
结构体 s
(具有 p
个字段)转换为 p
×m
×n
元胞数组 c
。如果结构体 s
是多维数组,则元胞数组 c
的大小为 [p size(s)]
。”
学习过程中用的是《MATLAB编程与工程应用(第二版)》的中文版,对“ s.category = 'tree' ”中的category,书上称为“域名”(大概就像C++类里面的成员变量和map里面的key,python的字典里的键)。也就是文档里的“字段”(发现其实matlab中也是叫字段,学习还是不专心啊)。
元胞数组的大小可以用size得到,结果是一个向量,所以文档中用[ ]括出。
就以文档中的struct为基础,再多增加一个维度。
>> s.category = 'tree';
s.height = 37.4; s.name = 'birch';
s(2).category = 'tree2';
s(2).height = 37.42; s(2).name = 'birch2';
>> disp(s)
包含以下字段的 1×2 struct 数组:
category
height
name
可以看到现在的struct数组相当于是个行向量,可以转置成列向量(这一步用到的reshape后面也会看到)。
>> reshape(s,2,1)
ans =
包含以下字段的 2×1 struct 数组:
category
height
name
2.然后就是真正调用struct2cell了。
>> scell = struct2cell(s)
3×1×2 cell 数组
scell(:,:,1) =
{'tree' }
{[37.4000]}
{'birch' }
scell(:,:,2) =
{'tree2' }
{[37.4200]}
{'birch2' }
可以看到,和文档中说的一样,现在的scell是一个3×1×2的元胞数组,即size(scell)的结果为 [3 1 2]。
二、从cell到struct
文档中很详细的介绍了二维的cell到struct的转换,所以把第一步转换得到的三维元胞数组用reshape转化成了二维,后来发现直接类推就可以把三维的cell变成struct。
1.三维元胞数组变二维的转换
scell2 = reshape(scell, 3, 2)
scell2 =
3×2 cell 数组
{'tree' } {'tree2' }
{[37.4000]} {[37.4200]}
{'birch' } {'birch2' }
现在就和文档中写的一样,是一个二维数组。
可以设置字段和原来一样,即fields = {'category', 'height', 'name'}。也就是从scell2的行获取字段,指定dim为1。
>> s1 = cell2struct(scell2, fields, 1)
s1 =
包含以下字段的 2×1 struct 数组:
category
height
name
2.直接转换
写博客也是一个在加深理解的过程啊。
——来自一个不想看csapp数分数算离散概统的客户端
你看写着写着这不就有了新想法嘛_(:з」∠)_(拼命解释)
(1)按行获取字段(使用和原struct一样的fields)
>> s2 = cell2struct(scell, fields, 1)
s2 =
包含以下字段的 1×2 struct 数组:
category
height
name
发现s1和s2除了行列不同都是一样的呢。
(2)按第三维获取字段,把cell2struct的参数dim设为3
在自定义字段名的时候有一些细节,如下:
>> fields2 = {1, 2};
>> s3 = cell2struct(scell, fields2, 3)
错误使用 cell2struct
字段名称必须为非空的字符向量。
>> fields2 = {'1', '2'};
>> s3 = cell2struct(scell, fields2, 3)
错误使用 cell2struct
字段名称 "1" 无效
最后转换成功:
>> fields3 = {'first', 'second'};
>> s3 = cell2struct(scell, fields3, 3)
s3 =
包含以下字段的 3×1 struct 数组:
first
second
以及s3的具体内容:
>> disp(s3(1))
first: 'tree'
second: 'tree2'
>> disp(s3(2))
first: 37.4000
second: 37.4200
>> disp(s3(3))
first: 'birch'
second: 'birch2'