在Matlab中对结构体数组的所有字段应用函数

3

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

A(1).x = 1;
A(1).y = 2;
A(2).x = 3;
A(2).y = 4;

我想要求出x值和y值的平均值。解决方案应适用于结构中的任意数量的字段。

我的初步想法是使用structfun,但现在我卡在了将结构体数组转换为数组结构体的问题上。我猜可以使用循环来遍历由fieldnames返回的字段名称,但也许有更直接的方法。


如果您想创建数组结构,然后使用 structfun 进行 mean 计算,请尝试这个解决方案 - Divakar
3个回答

3
如果内容是标量:将结构体转换为单元格,然后从单元格转换为矩阵:
mean(cell2mat(squeeze(struct2cell(A))), 2)

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

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)-

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接