Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何计算数组单元数组的加权平均数?_Arrays_Matlab_Cell_Weighted Average - Fatal编程技术网

Arrays 如何计算数组单元数组的加权平均数?

Arrays 如何计算数组单元数组的加权平均数?,arrays,matlab,cell,weighted-average,Arrays,Matlab,Cell,Weighted Average,概括而言,如何对单元元素(即阵列本身)进行加权平均 我将从如下修改开始: 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

概括而言,如何对单元元素(即阵列本身)进行加权平均


我将从如下修改开始:

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
在此之前,确保
重量
的形状正确。我认为需要处理的三个案例是

  • 权重=1(或任何常数)=>返回通常的平均值
  • numel(权重)=长度(c)=>权重是每个单元元素c{n}(但对于固定的n,每个数组元素的权重相等)
  • numel(权重)==numel(cell2mat(c))=>每个数组元素都有自己的权重
  • 案例1很简单,案例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)

    在熟悉之后,现在我的解决方案如下:

    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
    

    您是否考虑过将其作为一个函数,使用
    varargin
    并根据上面列出的三个标准解析
    weight
    参数?对于案例(2),请查看
    sub2ind
    ,以便将
    weight
    向量和
    c
    单元格转换为线性索引。您将失去此计算的结构,但您仍在计算平均值。只是大声想…@Phonon:re 1)是的,这就是它周围的框架,现在我只需要弄清楚如何重塑/repmat/。。。?每个箱子的重量正确。re 2)我想我没有理解你关于sub2int的观点,但我想澄清一下我想要的是什么:
    meansarray
    的结构应该与
    c{1}
    的结构相同,也就是说,我不想要所有元素的平均值,而是每个数组位置的平均值