在MATLAB中连接两个或多个struct-type变量

时间:2014-03-17 15:35:34

标签: matlab

假设所有变量的类型都是struct并且具有fieldsconcatenatable大小(维度)。例如:

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;

我想要的是:

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;

编写这样的代码是浪费时间。有没有好办法呢?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

如果所有内容都是相同大小的数字或行向量,则可以在没有循环的情况下完成:

f = fieldnames(a);   
t = [f mat2cell(cell2mat([struct2cell(a) struct2cell(b)]), ones(1,numel(f)))].';
c = struct(t{:});

这里的想法是生成字符串的单元格数组(t),这样当扩展为comma-separated listt{:})时,它将生成struct的输入参数有必要建立c

示例:

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]