【问题标题】:Prevent MATLAB from turning single element arrays into a non-array type防止 MATLAB 将单元素数组转换为非数组类型
【发布时间】:2017-01-26 15:19:56
【问题描述】:

我有一个单元格数组,其中每个单元格都包含一个字符串数组。一个例子如下:

example = {{['a'], ['b']}, {['c']}}

然而,

example{1}

返回一个 1x2 元胞数组,而

example{2}

返回一个单元格,而不是预期的 1x1 单元格数组。然后,此单个单元格值的格式与封装示例单元格数组的格式不同,这会进一步中断计算。

我该如何解决这个问题?理想情况下,我希望能够拥有一个 1x1 单元阵列并避免任何令人讨厌的特殊情况。

【问题讨论】:

    标签: arrays matlab cells


    【解决方案1】:

    在 MATLAB 中,标量实体和 1 x 1 数组没有区别。标量只是数组的 1 x 1 版本。没有特殊的数组类,数组就是a list of objects that have the same class。无论是double 数组、char 数组、struct 数组,还是在您的情况下为cell 数组(更多信息here),这都是正确的。

    因此,example{2}确实返回一个 1 x 1 元胞数组。您可以使用 classsizeiscell 和/或 whos 测试 example{2} 实际上是一个 1 x 1 单元格

    class(example{2})
    %   cell
    
    size(example{2})
    %   1   1
    
    iscell(example{2})
    %   1
    
    tmp = example{2};
    whos('tmp')
    %  Name      Size            Bytes  Class    Attributes
    %
    %  tmp       1x1               114  cell
    

    由于它是一个 1 x 1 元胞数组,您的其余代码应该能够毫无问题地处理它(假设您正确编写了其余代码)。

    【讨论】:

      【解决方案2】:

      单元素元胞数组仍然是大小为 1x1 的元胞数组。观察:

      >> class(example{1})
      ans =
      cell
      >> class(example{2})
      ans =
      cell
      >> size(example{1}) 
      ans =
           1     2
      >> size(example{2}) 
      ans =
           1     1
      

      您可以单独测试您的数组大小是否为 1x1,特别是在代码的下方,或者考虑以某种方式使用 () 语法索引单元格数组是否对您更有利,例如:

      >> example(1)
      ans = 
          {1x2 cell}
      >> example(2)
      ans = 
          {1x1 cell}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-22
        • 1970-01-01
        • 2012-02-04
        • 2012-06-14
        • 1970-01-01
        相关资源
        最近更新 更多