结构线的平均值

时间:2018-02-08 18:03:35

标签: matlab structure mean

我有像

这样的结构
struct =
Fields   Subject1          Subject2        Subject3      Subject4
    1 30000x1 double    30000x1 double  30000x1 double  30000x1 double
    2 30000x1 double    30000x1 double  30000x1 double  30000x1 double
    3 30000x1 double    30000x1 double  30000x1 double  30000x1 double
    4 30000x1 double    30000x1 double  30000x1 double  30000x1 double

其中1,2,3和4是条件

我想计算每个条件的平均值,因此对于每个结构的LINE。

我尝试过:

for i = 1:length(struct)
mean_condition(i) = mean([strut(i)]);
end

但我得到了这个错误

Error using sum
Invalid data type. First argument must be numeric or logical.

Error in mean (line 117)
        y = sum(x, dim, flag)/size(x,dim);

我该如何解决?

2 个答案:

答案 0 :(得分:1)

虽然structfun允许您对结构的字段执行操作,但它仅适用于标量数组。因为你有一个结构数组,所以你需要使用显式循环或隐式arrayfun循环。

作为后者的一个例子:

condition(1).subject1 = 1:10;
condition(1).subject2 = 1:20;
condition(2).subject1 = 1:30;
condition(2).subject2 = 1:40;

results = arrayfun(@(x)mean(structfun(@mean, x)), condition).';

这给了我们:

results =

     8
    18

我们可以通过以下方式验证:

>> [mean([mean(condition(1).subject1), mean(condition(1).subject2)]); mean([mean(condition(2).subject1), mean(condition(2).subject2)])]

ans =

   8
   18

根据MATLAB版本,由于额外的函数调用开销,*fun函数可能比显式循环慢。旧版本的MATLAB肯定会出现这种情况,但引擎改进已开始为其性能带来平等。

为了完整起见,一个显式的循环版本:

results = zeros(numel(condition, 1));
for ii = 1:numel(condition)
    tmpnames = fieldnames(condition(ii));
    tmpmeans = zeros(numel(tmpnames, 1));
    for jj = 1:numel(tmpnames)
        tmpmeans(jj) = mean(condition(ii).(tmpnames{jj}));
    end
    results(ii) = mean(tmpmeans);
end

答案 1 :(得分:1)

由于数组中所有结构的字段具有相同的大小,因此您可以非常轻松地执行此计算,如下所示:

s = struct();
s_len = 4;

for i = 1:s_len
    s(i).Subject1 = repmat(i,30,1);
    s(i).Subject2 = repmat(i,30,1);
    s(i).Subject3 = repmat(i,30,1);
    s(i).Subject4 = repmat(i,30,1);
end

m = reshape(mean(cell2mat(struct2cell(s))),s_len,1);

变量m则是double值的行向量,其中每行包含相应条件的平均值:

m =
     1 % mean of condition 1
     2 % mean of condition 2
     3 % mean of condition 3
     4 % mean of condition 4