我需要将一个函数(即mean
)应用于结构体数组的所有字段。例如,如果我有以下结构体数组:
A(1).x = 1;
A(1).y = 2;
A(2).x = 3;
A(2).y = 4;
我想要求出x值和y值的平均值。解决方案应适用于结构中的任意数量的字段。
我的初步想法是使用structfun
,但现在我卡在了将结构体数组转换为数组结构体的问题上。我猜可以使用循环来遍历由fieldnames
返回的字段名称,但也许有更直接的方法。
mean(cell2mat(squeeze(struct2cell(A))), 2)
F=fieldnames(A)
G=struct()
for ix=1:numel(F)
G.(F{ix})=mean([A.(F{ix})]);
end
cell2struct(cellfun(@(x)(mean([A.(x)])),fieldnames(A),'uni',false),fieldnames(A),1)
cell2struct
。方法 #1
如果你想要创建一个数组结构,并使用structfun
来执行mean
操作,可以尝试这种无循环的方法 -
%// Get fieldnames
fns = fieldnames(A)
%// Get numeric values from the fields and store as numeric array
arrayvals = reshape(struct2array(A),numel(fns),[])
%// Convert to cell array so that struct of arrays could be obtained
data = mat2cell(arrayvals,ones(1,numel(fns)),size(arrayvals,2))
%// Convert to struct of arrays as you were looking to work with
A1 = cell2struct(data, fns, 1)
%// Finally the mean values with structfun
meanvals = structfun(@mean, A1)
输出(显示A和A1)-
A =
1x2 struct array with fields:
x
y
A1 =
x: [1 3]
y: [2 4]
方法2
如果你不想使用structfun
,想直接获得mean
结果,可以将你的结构体直接转换为数值数组,然后以这种方式获取平均值 -
meanvals = mean(reshape(struct2array(A),numel(fieldnames(A)),[]),2)
structfun
进行mean
计算,请尝试这个解决方案。 - Divakar