cell2struct&struct2cell的互相转换

MATLAB的两个内建函数:把结构体数组转换成元胞数组的struct2cell,把元胞数组转换为结构体数组(或者叫结构体向量)的cell2struct

 先贴一下官方文档:https://ww2.mathworks.cn/help/matlab/ref/struct2cell.html

                                 https://ww2.mathworks.cn/help/matlab/ref/cell2struct.html

目录

一、从struct到cell

二、从cell到struct


文档的解释和示例都很详细了,记录一下自己在把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'

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值