如何在MATLAB中合并结构体或结构体数组?

3
我正在尝试合并两个具有相同字段的结构体。我尝试了几种方式,例如这个这个。但它要么合并出现问题,要么根本无法工作。
我的两个(简化的)结构体如下:
a(1).name = 'x';
a(1).data = 1;
a(2).name = 'y';
a(2).data = 2;

并且

b(1).name = 'x';
b(1).data = 3;
b(2).name = 'y';
b(2).data = 4;

所需的输出与此相同:
c(1).name = 'x';
c(1).data = 1;
c(2).name = 'y';
c(2).data = 2;
c(3).name = 'x';
c(3).data = 3;
c(4).name = 'y';
c(4).data = 4;

有什么简单的方法可以做到这一点吗?在我的实际数据结构中,有超过两个字段和一千个值。


7
这段代码的意思是将变量a和b组合成一个列表,赋值给变量c。 - Matthias W.
@MatthiasW。没门 facepalm - Arthur Tarasov
1
啊..我正想建议使用horzcat - 或者像@MatthiasW.建议的那样使用[a b]。 - GameOfThrows
1
在一般情况下,如果您没有完全匹配的字段,您可能想查看http://www.mathworks.com/matlabcentral/fileexchange/7842-catstruct。 - Carl Witthoft
2个回答

1
以下代码实现了这一功能。
%-------------------------------------------------------
a(1).name = 'x';
a(1).data = 1;
a(2).name = 'y';
a(2).data = 2;
b(1).name = 'x';
b(1).data = 3;
b(2).name = 'y';
b(2).data = 4;

c = struct('name',{a(:).name,b(:).name},'data',{a(:).data,b(:).data});
%-------------------------------------------------------
>> c(1)
ans =
    name: 'x'
    data: 1
>> c(2)
ans =
    name: 'y'
    data: 2
>> c(3)
ans =
    name: 'x'
    data: 3
>> c(4)
ans =
    name: 'y'
    data: 4

1

这个问题在Matthias W.的评论中被简要回答了,所以我会在这里详细说明...

结构体具有相同的字段时,您可以像处理其他对象一样对待它们,当连接它们时。以上例子的解决方案如下:

c = [a b];

由于此处的ab均为1x2结构数组,因此这将它们水平连接成一个更大的1x4结构数组。如果不知道ab的大小/维度,我们可以这样做:

c = [a(:).' b(:).'];

这里使用冒号操作符将它们重塑为列数组,然后转置它们成为行数组再进行拼接。

更复杂的情况...

  • 合并结构中的合并字段: 此问题 处理的情况是当您想将多个具有相同字段的结构(而不是结构数组)组合成一个单一结构时。在这种情况下,每个单独的字段都将跨多个结构进行连接。

  • 将不同的结构合并为一个: 此问题 处理的情况是您有多个具有不同字段的结构,并且您想将它们合并为一个具有所有来自每个单独结构的字段的单一结构。必须考虑的警告是如何处理冲突:如果在多个结构中出现相同字段,则哪个字段值会出现在最终合并的结构中?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接