将结构数组转换为结构单元,反之亦然

And*_*ndy 3 matlab octave cell-array matlab-struct

我经常需要处理结构数组和包含具有相同字段名的标量结构的单元格,我将其称为“解包结构数组”,我想知道 Matlab 和/或 GNU Octave 中是否还没有函数可以帮助在这两种表示形式之间进行转换。

结构体数组:

foo(1).a = 3;
foo(1).b = pi;
foo(2).a = 5;
foo(2).b = 2.718;
Run Code Online (Sandbox Code Playgroud)

显然num2cell在 GNU Octave 中以一种方式工作(尽管文档中没有提到):

ret = num2cell (foo)
ret =
{
  [1,1] =

    scalar structure containing the fields:

      a =  3
      b =  3.1416

  [1,2] =

    scalar structure containing the fields:

      a =  5
      b =  2.7180

}
Run Code Online (Sandbox Code Playgroud)

但我正在寻找相反的部分,转换retfoo.

Lui*_*ndo 5

这似乎做你想做的:

foo2 = [ret{:}]; % or equivalently foo2 = horzcat(ret{:});
Run Code Online (Sandbox Code Playgroud)

也就是说,只需水平连接元胞数组的内容即可。

查看:

>> foo(1).a = 3;
foo(1).b = pi;
foo(2).a = 5;
foo(2).b = 2.718;
>> ret = num2cell (foo);
>> foo2 = [ret{:}];
>> isequal(foo, foo2)
ans =
  logical
   1
Run Code Online (Sandbox Code Playgroud)