Matlab:添加两个结构

时间:2012-02-21 21:56:43

标签: matlab

我有:

A = 

a: 1
b: 2
c: 3
d: 4

B = 

e: 10
d: 10
b: 10
a: 10

我想将这两个连接起来如下。

new_struct = 

a: 11
b: 12
c: 3
d: 14
e: 10

'new'中字段的顺序无关紧要。

我一直在努力学习高效的matlab编程。如果不使用for循环和if语句,我该怎么做?

2 个答案:

答案 0 :(得分:1)

我认为现在已经解决了这个问题,但是对于其他来自谷歌的人来说,这里有一个函数可以添加两个结构(虽然不是所描述的方式)。它 用于循环和if语句,但希望它对某些人有用。

function S = addStructs(S1, S2)
% S = addStructs(S1, S2)
%
% Given two structs S1 and S2, returns a struct S such that
% S.<fieldName> = S1.<fieldName> + S2.<fieldName> for all 
% fieldNames whose corresponding values are both numeric
% and the same length in both S1 and S2.
%
% If the values are not numeric or not the same length, the
% value from S1 is copied to S.
%
% This function will throw an error if the field names in
% S1 and S2 are not the same.
%
% Example:
%
% >> s1
% 
% s1 = 
% 
%       a: 1
%       b: 2
%       c: [1 2 3]
%     foo: 'bar'
% 
% >> s2
% 
% s2 = 
% 
%       a: 1
%       b: 4
%       c: 3
%     foo: 'baz'
% 
% >> addStructs(s1, s2)
% 
% ans = 
% 
%       a: 2
%       b: 6
%       c: [1 2 3]
%     foo: 'bar'

fNames1 = fieldnames(S1);
fNames2 = fieldnames(S2);

diff = setdiff(fNames1, fNames2);
if ~isempty(diff)
   error('addStructs: structures do not contain same field names')
end

numFields = length(fNames1);

for i=1:numFields

    % get values for each struct for this field
    fNameCell = fNames1(i);
    fName = fNameCell{:};
    val1 = S1.(fName);
    val2 = S2.(fName);

    % if field non-numeric, use value from first struct
    if (~isnumeric(val1) || ~isnumeric(val2) )
        S.(fName) = val1;

    % if fields numeric but not the same length, use value
    % from first struct
    elseif (length(val1) ~= length(val2) )
        S.(fName) = val1;

    % if fields numeric and same length, add them together
    else
        S.(fName) = val1 + val2;
    end
end

end

答案 1 :(得分:0)

我建议CATSTRUCT并查看Loren的内容here。我认为你希望有一个更优雅的解决方案,但我认为这些技术是社区已经解决的问题。