如何计算阵列单元阵列的加权平均值?

时间:2011-03-08 10:48:33

标签: arrays matlab cell weighted-average

my previous question的概括中,如何对单元格元素(即并且将保留数组本身)的加权平均值执行?


我首先要像这样修改gnovice's answer

dim = ndims(c{1});          %# Get the number of dimensions for your arrays
M = cat(dim+1,c{:});        %# Convert to a (dim+1)-dimensional matrix
meanArray = sum(M.*weigth,dim+1)./sum(weigth,dim+1);  %# Get the weighted mean across arrays

在此之前,请确保weight具有正确的形状。我认为需要照顾的三个案例是

  1. 重量= 1(或任何常数)=>返回通常的平均值
  2. numel(weight)== length(c)=>权重是每个单元格c {n}(但对于固定n的每个数组元素都相等)
  3. numel(weight)== numel(cell2mat(c))=>每个数组元素都有自己的权重......
  4. 案例一很容易,案例3不太可能发生,所以我对案例2感兴趣:如何将权重转换为数组,使M.*weight在上面的总和中具有正确的维度?当然,一个答案显示了另一种获得加权平均值的方法。


    编辑事实上,如果权重与c具有相同的结构,案例3甚至比案例1更为简单(重言式,道歉)

    以下是我对案例2的意思的一个例子:

    c = { [1 2 3; 1 2 3], [4 8 3; 4 2 6] };
    weight = [ 2, 1 ];
    

    应该返回

    meanArray = [ 2 4 3; 2 2 4 ]
    

    (例如,对于第一个元素(2 * 1 + 1 * 4)/(2 + 1)= 2)

1 个答案:

答案 0 :(得分:1)

熟悉REPMAT之后,现在这是我的解决方案:

function meanArray = cellMean(c, weight)
% meanArray = cellMean(c, [weight=1])
% mean over the elements of a cell c, keeping matrix structures of cell
% elements etc. Use weight if given.

% based on http://stackoverflow.com/q/5197692/321973, courtesy of gnovice
% (http://stackoverflow.com/users/52738/gnovice)
% extended to weighted averaging by Tobias Kienzler
% (see also http://stackoverflow.com/q/5231406/321973)

dim = ndims(c{1});          %# Get the number of dimensions for your arrays
if ~exist('weight', 'var') || isempty(weight); weight = 1; end;
eins = ones(size(c{1})); % that is german for "one", creative, I know...
if ~iscell(weight)
    % ignore length if all elements are equal, this is case 1
    if isequal(weight./max(weight(:)), ones(size(weight)))
        weight = repmat(eins, [size(eins)>0 length(c)]);
    elseif isequal(numel(weight), length(c)) % case 2: per cell-array weigth
        weight = repmat(shiftdim(weight, -3), [size(eins) 1]);
    else
        error(['Weird weight dimensions: ' num2str(size(weight))]);
    end
else % case 3, insert some dimension check here if you want
    weight = cat(dim+1,weight{:});
end;

M = cat(dim+1,c{:});        %# Convert to a (dim+1)-dimensional matrix
sumc = sum(M.*weight,dim+1);
sumw = sum(weight,dim+1);
meanArray = sumc./sumw;  %# Get the weighted mean across arrays