我有像
这样的结构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);
我该如何解决?
答案 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