Arrays 在Matlab中将函数应用于结构数组的所有字段

Arrays 在Matlab中将函数应用于结构数组的所有字段,arrays,matlab,struct,Arrays,Matlab,Struct,我需要对结构数组的所有字段应用一个函数(即mean)。即,如果我有以下结构数组: A(1).x = 1; A(1).y = 2; A(2).x = 3; A(2).y = 4; 我想求x值的平均值和y值的平均值。该解决方案应适用于结构中任意数量的字段 我最初的想法是使用structfun,但现在我遇到了将结构数组转换为数组结构的问题。我想我可以使用循环来迭代由fieldnames返回的字段名,但也许有一种更简单的方法。我知道的最简单的解决方案 F=fieldnames(A) G=struct(

我需要对结构数组的所有字段应用一个函数(即
mean
)。即,如果我有以下结构数组:

A(1).x = 1;
A(1).y = 2;
A(2).x = 3;
A(2).y = 4;
我想求x值的平均值和y值的平均值。该解决方案应适用于结构中任意数量的字段


我最初的想法是使用
structfun
,但现在我遇到了将结构数组转换为数组结构的问题。我想我可以使用循环来迭代由
fieldnames
返回的字段名,但也许有一种更简单的方法。

我知道的最简单的解决方案

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

:从结构转换为单元,然后从单元转换为矩阵:

mean(cell2mat(squeeze(struct2cell(A))), 2)
方法#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)-


方法#2

如果您想跳转到
平均值
结果,而不必为
structfun
而烦恼,您可以直接将结构转换为数字数组,并通过这种方式获得平均值-

meanvals = mean(reshape(struct2array(A),numel(fieldnames(A)),[]),2)

如果要创建数组的结构,然后使用
structfun
进行
mean
计算,请尝试以下方法
meanvals = mean(reshape(struct2array(A),numel(fieldnames(A)),[]),2)