我想构造一个具有三个属性的结构对象:
arg1 = 42;
arg2 = 'test';
arg3 = cell(0);
但是如果我尝试初始化该对象:
struct('arg1', arg1, 'arg2', arg2, 'arg3', arg3);
它返回一个空结构:
ans =
0×0 empty struct array with fields:
arg1
arg2
arg3
我发现空单元格是罪魁祸首,所以如果我在没有空单元格的情况下初始化它,它会返回一个正确的值:
ans =
struct with fields:
arg1: 42
arg2: 'test'
arg3: []
但是我需要我的代码来处理空单元格,我不知道它们是否或在哪里会在其中一个字段中。
有没有办法摆脱这个问题?
@Wolfie对行为的解释是正确的。
解决方法是将数据放在单元格数组中,如下所示:
>> struct('arg1', {arg1}, 'arg2', {arg2}, 'arg3', {arg3})
ans =
struct with fields:
arg1: 42
arg2: 'test'
arg3: {}
这是有效的,因为文档中的这一行:
- 如果任何值输入是非标量单元数组,则 s 与非标量单元数组具有相同的维度。
因此,我们将所有值输入单元格数组。{arg3}
与{{}}
相同,一个具有一个元素的单元数组:一个空的单元格数组。
请注意,可以使用以下语法创建结构数组:
>> struct('arg1', {1,2,3}, 'arg2', {arg2}, 'arg3', {arg3})
ans =
1×3 struct array with fields:
arg1
arg2
arg3
由于'arg1'
参数是包含 3 个元素的单元格数组,因此创建的结构数组也有 3 个元素。具有单个元素的单元数组将跨所有单元数组进行复制。
这是记录在案的行为:
s = struct(field,value)
创建具有指定field
和values
的结构数组。value
输入参数可以是任何数据类型,例如数字、逻辑、字符或单元格数组。
如果任何
value
输入是非标量单元数组,则s
与非标量单元数组具有相同的维度。[...]如果
value
是空的单元格数组{}
,则s
是空的(0×0)结构。要指定空字段并保留其他字段的值,请改用[]
作为值输入
给你的外卖是最后一行。
要解决此问题,您必须进行以下检查:
if iscell( argX ) && isempty( argX )
argX = [];
end
如果您的结构中总是只有 3 个项目,那么实现起来相当简单。