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

时间:2018-12-14 12:20:03

标签: matlab struct cell

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

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: []

但是我需要我的代码才能处理空单元格,而且我不知道是否位置在其中一个字段中。

有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:3)

@Wolfie's explanation for the behavior是正确的。

解决方法是像这样将数据放入单元格数组中:

>> 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个元素的单元格数组,所以创建的struct数组也包含3个元素。具有单个元素的单元格阵列会在所有单元格阵列中复制。

答案 1 :(得分:2)

这是documented行为:

  

s = struct(field,value)使用指定的fieldvalues创建一个结构数组。 value输入参数可以是任何数据类型,例如数字,逻辑,字符或单元格数组。

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

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

  •   

为您带来的收获是最后一行。

要解决此问题,您将必须进行类似的检查

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

如果您的结构中始终只有3个项目,那么实现起来就很简单。