关于Matlab元胞结构体的赋值问题

此文仅将在Matlab调试过程中发现的一个易忽略的问题作一个记录。编程如下读取结构体target中的数据,target结构体如下所示:



代码如下:

 tr_ind=find(img.images.set==1);
 te_ind=find(img.images.set==3);
 train.feature=target.feature{tr_ind};
 train.mask=target.mask{tr_ind};
 train.size=target.size{tr_ind};
 test.feature=target.feature{te_ind};
 test.mask=target.mask{te_ind};
 test.size=target.size{te_ind};
如此代码,在train与test中只赋值了target各域中的一个元素,将上述代码中的{}改为()后,成功读取tr_ind和te_ind索引对应的所有内容,如下代码:

 tr_ind=find(img.images.set==1);
 te_ind=find(img.images.set==3);
 train.feature=target.feature(tr_ind);
 train.mask=target.mask(tr_ind);
 train.size=target.size(tr_ind);
 test.feature=target.feature(te_ind);
 test.mask=target.mask(te_ind);
 test.size=target.size(te_ind);
当然,这也涉及到()与{ }读取元胞还是元胞内容的区别,但是易被忽略。







参考:

1. 关于Matlab下的cell元胞与struct结构体

### MATLAB结构体的用法及区别 #### 结构体的使用方法 在 MATLAB 中,结构体是一种可以存储不同类型的数据容器。每个结构体都有多个字段,这些字段可以保存不同类型的变量。 创建结构体可以通过直接赋值来完成: ```matlab % 创建单个结构体 person.name = 'John Doe'; person.age = 30; person.height = 175; % 显示结构体内容 disp(person); ``` 对于结构体数组,则可通过索引来访问各个元素中的特定字段[^1]: ```matlab people(1).name = 'Alice'; people(2).name = 'Bob'; % 访问第二个元素的名字字段 disp(people(2).name); % 输出 Bob ``` 还可以利用 `fieldnames` 函数获取所有字段名称列表;而要动态设置或读取某个未知名字下的属性时可借助于 `getfield` 和 `setfield` 函数[^2]。 #### 的使用方法 相比之下,cell)更像一个多维表格,其中每一格都可以容纳任意类型的数据对象——无论是数、字符还是其他复杂数据形式。这使得它非常适合用来组织异质性的集合。 定义一个简单的如下所示: ```matlab C{1} = 'Text'; % 字符串 C{2} = pi; % 浮点数 C{3} = magic(3); % 矩阵 ``` 当需要提取某一部分的内容时,可以根据位置采用花括号 `{}` 或者圆括号 `()` 来实现不同的效果:前者返回实际储存的对象本身,后者则给出一个新的由所选部分组成的较小规模的单格矩阵[^3]。 #### 主要差异对比 | 特征 | 结构体 | | |-------------| | 数据组织方式 | 基于命名字段 | 定位基于下标 | | 存储灵活性 | 同一结构体内各成员需预先声明其字段名 | 不必事先规定内部项的形式 | | 访问模式 | 使用`.`运算符指定路径 | 利用{}和()操作符 | #### 示例比较 下面是一个具体的例子展示两者之间的差别以及各自的适用场景: 假设有一个学生记录表,既可以用结构体也可以用表示: - **作为结构体** ```matlab studentStruct.name = "张三"; studentStruct.ID = 2023098765; studentStruct.grades = [88, 92]; ``` - **作为** ```matlab studentCell{1} = "李四"; % 名字 studentCell{2} = int32(2023123456); % ID编号 studentCell{3} = [95, 87]; % 成绩向量 ``` 显然,在这种情况下,如果经常按照固定的信息类别查询的话,那么选择结构体会更加直观易懂一些;但如果不确定每条记录的具体构成或者希望灵活调整布局,则可能更适合选用[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值