首页 > 解决方案 > 结合 2 个 MATLAB 结构

问题描述

我有两个想要合并的小结构,但找不到合适的解决方案。结构 A 和 B 有一个共同的列(相同的字符串值),尽管重要的是共同值不一定在两者之间的顺序相同。例如,我将它们按不同的顺序排列。我想实现下面的结构 C 中的内容,其中两个结构的信息被组织在一起:

A(1).condition = 'con1';
A(1).y = rand(10, 1);
A(2).condition = 'con2';
A(2).y = rand(10, 1);

B(1).condition = 'con2';
B(1).z = normrnd(0,1);
B(2).condition = 'con1';
B(2).z = normrnd(0,1);

% Desired output:
C = A;
C(1).z = B(2).z;
C(2).z = B(1).z

标签: matlab

解决方案


你需要:

  1. 根据 的值,找出一个结构数组的元素与另一个匹配的顺序condition
  2. 将每个字段复制B(i)到数组的相应元素中A。我假设除了 and 之外还有更多的B字段。zcondition

步骤 1 可以使用 来完成ismember,其第二个输出参数将索引提供给一个数组匹配另一个数组中的元素。我们假设 的每个元素在 中B都有一个匹配的元素A

[~,I] = ismember({A.condition},{B.condition});

请注意,这是一个包含所有字符串{A.condition}的元胞数组。是重新排序以匹配的结构数组。conditionB(I)BA

第 2 步可以像rahnema1 的回答那样完成,我们在这里概括为使用字段名称上的循环并使用动态字段名称来复制多个字段:

fields = fieldnames(B);
fields = setdiff(fields,'condition'); % don't copy over this field
for ii = 1:numel(fields)
   [A.(fields{ii})] = B(I).(fields{ii});
end

测试:

A(1).condition = 'con1';
A(1).y = [1,1,1];
A(2).condition = 'con2';
A(2).y = [2,2];
A(3).condition = 'con3';
A(3).y = [3,3,3];

B(1).condition = 'con2';
B(1).z = 2;
B(1).x = 'b';
B(2).condition = 'con3';
B(2).z = 3;
B(2).x = 'c';
B(3).condition = 'con1';
B(3).z = 1;
B(3).x = 'a';

[~,I] = ismember({A.condition},{B.condition});

fields = fieldnames(B);
fields = setdiff(fields,'condition'); % don't copy over this field
for ii = 1:numel(fields)
   [A.(fields{ii})] = B(I).(fields{ii});
end

这会产生以下结构A

>> A(1)

ans = 

  struct with fields:

    condition: 'con1'
            y: [1 1 1]
            x: 'a'
            z: 1

>> A(2)

ans = 

  struct with fields:

    condition: 'con2'
            y: [2 2]
            x: 'b'
            z: 2

>> A(3)

ans = 

  struct with fields:

    condition: 'con3'
            y: [3 3 3]
            x: 'c'
            z: 3

推荐阅读