在matlab中计算三维单元阵列的均值

时间:2012-10-10 09:40:05

标签: arrays matlab matrix cell mean

我有一个大小为< 20x1x19>的单元格数组C,每个元素包含19个元素 一组20个大小的矩阵(80x90), 我怎样才能计算每个20矩阵的平均值并将结果存储在矩阵M中,以便最终得到一个大小为80x90x19的矩阵,其中包含单元阵列矩阵的平均值。

例如:

M(:,:,1)将具有C(:,:,1)中元素的均值;

M(:,:,2)将具有C(:,:,2)中元素的均值

等等。

2 个答案:

答案 0 :(得分:4)

一点阵列操作允许你放弃循环。您可以更改单元格数组上的维度,以便cell2mat生成80 x 90-by-19-by-20数组,之后您需要做的就是沿着维度#4的平均值:< / p>

%# C is a 20x1x19 cell array containing 80x90 numeric arrays

%# turn C into 1x1x19x20, swapping the first and fourth dimension
C = permute(C,[4 2 3 1]);

%# turn C into a numeric array of size 80-by-90-by-19-by-20
M = cell2mat(C);

%# average the 20 "slices" to get a 80-by-90-by-19 array
M = mean(M,4);

答案 1 :(得分:2)

假设我理解正确,你可以通过以下方式做你想做的事(评论解释我一步一步做的事):

% allocate space for the output
R = zeros(80, 90, 19);

% iterate over all 19 sets
for i=1:19
    % extract ith set of 20 matrices to a separate cell
    icell = {C{:,1,i}};

    % concatenate all 20 matrices and reshape the result
    % so that one matrix is kept in one column of A 
    % as a vector of size 80*90
    A = reshape([icell{:}], 80*90, 20);

    % sum all 20 matrices and calculate the mean
    % the result is a vector of size 80*90
    A = sum(A, 2)/20;

    % reshape A into a matrix of size 80*90 
    % and save to the result matrix
    R(:,:,i) = reshape(A, 80, 90);    
end

您可以跳过提取到icell并直接连接第20组矩阵

A = reshape([C{:,1,i}], 80*90, 20);

我只是为了清楚而在这里做了。

以下arrayfun调用表达的上述步骤可以更简单(但绝对更加隐蔽!):

F = @(i)(reshape(sum(reshape([C{:,1,i}], 80*90, 20), 2)/20, 80, 90));
R = arrayfun(F, 1:19, 'uniform', false);
R = reshape([R2{:}], 80, 90, 19);

匿名函数F基本上完成了循环的一次迭代。它被arrayfun称为19次,每组矩阵一次。我建议你坚持使用循环。