I want to combine two structures with differing fields names.
For example, starting with:
A.field1 = 1; A.field2 = 'a'; B.field3 = 2; B.field4 = 'b';
I would like to have:
C.field1 = 1; C.field2 = 'a'; C.field3 = 2; C.field4 = 'b';
Is there a more efficient way than using "fieldnames" and a for loop?
EDIT: Let's assume that in the case of field name conflicts we give preference to A
.
To concatenate structures, they must have the same set of fields, but the fields do not need to contain the same sizes or types of data. Just as concatenating two scalar values such as [1,2] creates a 1-by-2 numeric array, concatenating struct1 and struct2 creates a 1-by-2 structure array.
You can use the square bracket operator [] to concatenate. For example, [A,B] or [A B] concatenates arrays A and B horizontally, and [A; B] concatenates them vertically.
C = struct2cell( S ) converts a structure into a cell array. The cell array C contains values copied from the fields of S . The struct2cell function does not return field names. To return the field names in a cell array, use the fieldnames function.
str = append( str1,...,strN ) combines the text from str1,...,strN . Each input argument can be a string array, a character vector, or a cell array of character vectors. If any input is a string array, then the output is a string array.
Without collisions, you can do
M = [fieldnames(A)' fieldnames(B)'; struct2cell(A)' struct2cell(B)']; C=struct(M{:});
And this is reasonably efficient. However, struct
errors on duplicate fieldnames, and pre-checking for them using unique
kills performance to the point that a loop is better. But here's what it would look like:
M = [fieldnames(A)' fieldnames(B)'; struct2cell(A)' struct2cell(B)']; [tmp, rows] = unique(M(1,:), 'last'); M=M(:, rows); C=struct(M{:});
You might be able to make a hybrid solution by assuming no conflicts and using a try/catch around the call to struct
to gracefully degrade to the conflict handling case.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With