File Exchange

## structfun2

version 1.0.0.0 (2.92 KB) by
Apply a binary operation function to each field of two input structures

Updated 15 Jul 2014

Apply a binary operation function to each field of two input structures, including substructure fields of any level.
C = STRUCTFUN2(FUN, A, B) applies the function specified by FUN to each field of structures A and B, and returns the results in array C.

Examples:
s1 = struct; s1.a = 1; s1.b = 2; s1.c = struct; s1.c.a = 3;
s2 = struct; s2.a = 0; s2.b = 2; s2.c = struct; s2.c.a = -3;
s3 = structfun2(@plus, s1, s2);

### Cite As

Denis Anikiev (2021). structfun2 (https://www.mathworks.com/matlabcentral/fileexchange/47234-structfun2), MATLAB Central File Exchange. Retrieved .

Thomas Gerrits

Good idea! I extended it to support multiple inputs (ND), as well as non-struct inputs.

function out = structfunND(fun, varargin)

var = varargin;

idx_double = cellfun(@(x) isa(x, 'double'), var);
idx_struct = cellfun(@(x) isa(x, 'struct'), var);

out = struct;

% get field names, only common fieldnames are selected
try
fNames = intersect2(cellfun(@fieldnames, {(var{idx_struct})}, 'un', 0) );
catch % catch error if only one input is a struct
fNames = fieldnames(var{idx_struct});
end

% Loop each fieldname
for i = 1:length(fNames)

% Loop each input variable
for j = 1:length(var)
if idx_double(j)
varx{j} = var{j};
elseif idx_struct(j)
varx{j} = var{j}.(fNames{i});
else
error('Error: Unsupported input format!')
end
end

% Check for nested structures
if any(cellfun(@isstruct, varx))
out.(fNames{i}) = structfunND(fun, varx{:});
else
out.(fNames{i}) = fun(varx{:});
end

end

##### MATLAB Release Compatibility
Created with R2014a
Compatible with any release
##### Platform Compatibility
Windows macOS Linux