为什么要用空单元格构造 MATLAB 结构对象,而是创建一个空结构?



我想构造一个具有三个属性的结构对象:

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)创建具有指定fieldvalues的结构数组。value输入参数可以是任何数据类型,例如数字、逻辑、字符或单元格数组。

  • 如果任何value输入是非标量单元数组,则s与非标量单元数组具有相同的维度。[...]

  • 如果value是空的单元格数组{},则s是空的(0×0)结构。要指定空字段并保留其他字段的值,请改用[]作为值输入

给你的外卖是最后一行。

要解决此问题,您必须进行以下检查:

if iscell( argX ) && isempty( argX )
argX = [];
end

如果您的结构中总是只有 3 个项目,那么实现起来相当简单。

相关内容

  • 没有找到相关文章