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)