matlab - 结合 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
解决方案
你需要:
- 根据 的值,找出一个结构数组的元素与另一个匹配的顺序
condition
。 - 将每个字段复制
B(i)
到数组的相应元素中A
。我假设除了 and 之外还有更多的B
字段。z
condition
步骤 1 可以使用 来完成ismember
,其第二个输出参数将索引提供给一个数组匹配另一个数组中的元素。我们假设 的每个元素在 中B
都有一个匹配的元素A
:
[~,I] = ismember({A.condition},{B.condition});
请注意,这是一个包含所有字符串{A.condition}
的元胞数组。是重新排序以匹配的结构数组。condition
B(I)
B
A
第 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
推荐阅读
- java - 使用java在SQL中嵌套目录
- python - Python Google Cloud Natural Language API 返回 Bad Gateway 错误,状态为 502
- laravel - 碳:在计划后添加 60 秒间隔
- spring - 如何为 swagger 注释响应类型 ImmutableMap
- ios - view.bounds.size.height -vs- view.bounds.height——有什么不同吗?
- azure - Azure DevOps 管道中的通用硒测试
- azure - 逻辑应用程序加载 excel 的内容,然后将其转换为 csv
- amazon-web-services - AWS 使用 boto3 自动缩放创建 EMR 无法正常工作
- amazon-s3 - 无法将通知配置添加到 s3 存储桶
- python - Sklearn 凝聚聚类自定义亲和性