【问题标题】:Why contructing a MATLAB struct object with an empty cell it creates an empty struct instead?为什么用空单元构建 MATLAB 结构对象会创建一个空结构?
【发布时间】:2018-12-14 12:20:03
【问题描述】:

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

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

但我需要我的代码来处理空单元格,而且我不知道 ifwhere 它们将在其中一个字段中。

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

【问题讨论】:

    标签: matlab struct cell


    【解决方案1】:

    @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个元素。具有单个元素的元胞数组在所有元胞数组中复制。

    【讨论】:

      【解决方案2】:

      这是documented 行为:

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

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

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

      最后一行是你的收获。

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

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

      如果你的结构中总是只有 3 个项目,那么这很容易实现。

      【讨论】:

        猜你喜欢
        • 2020-05-23
        • 1970-01-01
        • 2015-05-23
        • 1970-01-01
        • 2018-06-13
        • 2014-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多