在MATLAB中连接两个或多个结构类型变量

5

假设所有变量的类型都是struct,并且具有相同的可连接尺寸(维数)。例如:

a.x = 1; a.y = 2;
b.x = 10; b.y = 20;

使用普通的串联:

c = [a; b];

返回值

c(1).x = 1; c(1).y = 2;
c(2).x = 10; c(2).y = 20;

What I want is:

c.x(1) = 1; c.y(1) = 2;
c.x(2) = 10; c.y(2) = 20;

以下是实现方法:

c.x = [a.x; b.x];
c.y = [a.y; b.y;];

然而,如果变量有很多字段,
a.x1 = 1;
a.x2 = 2;
% Lots of fields here
a.x100 = 100;

写这样的代码纯属浪费时间。有没有更好的方法?


1
你想对 c 做什么?你确定拥有 c(1).x 等会更有用吗?因为这样,如果你想选择一块数据,可以使用例如 c(5:10)。但是你的方式需要为每个字段编制索引。 - Dan
2个回答

2

这个函数可以做你想要的事情,但没有错误检查:

function C = cat_struct(A, B)
C = struct();
for f = fieldnames(A)'
   C.(f{1}) = [A.(f{1}); B.(f{1})];
end

您可以在上面的代码中像这样使用它:
c = cat_struct(a, b);

Mendo的解决方案也很有帮助。但在我看来,你的更易读,无论它是否表现更好。谢谢。 - Jeon

1
如果所有内容都是数字或者行向量大小相同,那么可以不使用循环来完成:
f = fieldnames(a);   
t = [f mat2cell(cell2mat([struct2cell(a) struct2cell(b)]), ones(1,numel(f)))].';
c = struct(t{:});

这里的想法是生成一个字符串的单元数组 (t),使其在扩展为一个逗号分隔列表 (t {:}) 时,能够生成构建c所需的struct输入参数。
示例:
a.x = [1 1]; a.y = [2 2]; a.z = [3 3];
b.x = [10 100]; b.y = [20 200]; b.z = [30 300];

提供

c = 

    x: [1 1 10 100]
    y: [2 2 20 200]
    z: [3 3 30 300]

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