【问题标题】:Convert Matlab struct array to cell array将 Matlab 结构数组转换为元胞数组
【发布时间】:2015-05-29 17:03:11
【问题描述】:

Matlab struct 数组是否可以在不遍历数组的情况下转换为元胞数组?

我希望结构数组中的每个结构都成为元胞数组中的一个元胞。命令 struct2cell 似乎没有这样做,因为它将结构中的每个字段分解为一个单独的单元格。

此内容已发布到:

【问题讨论】:

  • 您想在保留结构字段的同时从数组转换为单元格吗?您是否尝试过使用num2cell
  • 是的。您的答案是正确的(我将其标记为这样),但经过一些研究,我发现我应该提供更多有关预期用途的上下文。我发布了第二个答案。希望它可以避免人们走上同样的道路。

标签: matlab cell-array


【解决方案1】:

试试num2cell:

myStructCell = num2cell(myStruct);

例如:

>> myStruct(1).name = 'John';
>> myStruct(2).name = 'Paul';
>> myStruct

myStruct = 

1x2 struct array with fields:

    name

>> myStructCell = num2cell(myStruct)

myStructCell = 

    [1x1 struct]    [1x1 struct]

>> myStructCell{1}

ans = 

    name: 'John'

>> myStructCell{2}

ans = 

    name: 'Paul'

>> myStructCell{2}.name

ans =

Paul

【讨论】:

    【解决方案2】:

    实际上,我不认为我正在尝试做的事情是必要的。让我解释一下,以防其他人走上同一条路。

    上面的动机是我想从结构数组中的所有结构中提取某个子字段,并以逗号分隔列表的形式:

    myStruc(1).fieldX.subfieldA, ...
    myStruc(2).fieldX.subfieldA, ...
    myStruc(3).fieldX.subfieldA
    

    我知道我可以通过 myCellArray{:} 将所有单元格索引到一维单元格数组中来生成一个逗号分隔的列表。

    但是,我发现实际上有一个名为“逗号分隔列表”的完整帮助页面显示结构的行为方式相同。所以上面的逗号分隔列表等于 myStruc(:).fieldX.subfieldA。

    事实上,将 struct 数组转换为元胞数组是行不通的,因为在元胞数组的花括号索引之后,您不能使用点索引来访问字段。例如,如果有一种矢量化方式将 myStruct(i) 转换为 myCell(i),我希望能够生成

    myCellArray{1}.fieldX.subfieldA, ...
    myCellArray{2}.fieldX.subfieldA, ...
    myCellArray{3}.fieldX.subfieldA
    

    通过表达式 myCell{:}.fieldX.subfieldA。花括号后的点索引是语法错误。

    经验教训:直接使用结构数组索引来启用对结构字段和子字段的访问。

    ***** 警告 *****

    我只测试了使用多级点索引结合标量数字数组索引生成逗号分隔列表,例如 myCellArray{2}.fieldX.subfieldA。当使用向量数字索引代替标量值 2 时,它不起作用,即 Matlab 无法处理 myCellArray{:}.fieldX.subfieldA 或 myCellArray{2:3}.fieldX.subfieldA。

    哦,好吧。 :(

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多