矩阵中不等数量的值的按列平均值

时间:2019-05-28 20:29:27

标签: matlab matrix average indices

我正在寻找一种简单的方法来获取矩阵(由逻辑矩阵索引)中的值子集的按列平均值,最好不必使用循环。我遇到的问题是,因为每列中的值数量不同,所以matlab折叠了值矩阵,而其列平均值成为(整个矩阵的)总平均值。是否有针对此问题的特定功能或简单的解决方法?参见下面的示例。

    %% define value matrix and logical indexing matrix

    values=[1 2 3 4; 5 6 7 8; 9 10 11 12];
    indices=[1 0 0 1; 0 1 0 1; 1 1 0 0];
    indices=indices==1; %convert to logical

    %% calculate column-wise average

    mean(values(indices),1)

1 个答案:

答案 0 :(得分:4)

accumarray为基础的方法

将列索引用作accumarray的分组变量:

[~, col] = find(indices);
result = accumarray(col(:), values(indices), [size(values,2) 1], @mean, NaN).';

请注意:

  • 第二行使用(:)强制第一个输入成为列向量。之所以需要这样做,是因为第一行可能会根据行col的大小将indices生成为行或列向量。

  • NaN用作填充值。这被指定为accumarray的第五个输入。

  • accumarray的第三个输入定义输出大小。如果accumarray的最后一列仅包含indices,则必须明确指定它(而不是让false找出来)。

笨拙的方法

将元素逐个乘以indices。这样会将不需要的条目转换为NaN,然后mean可以使用'omitnan'选项将其忽略:

result = mean(values.*indices./indices, 1, 'omitnan');

手动方法

逐个元素乘以indices,将每一列相加,然后逐个除以indices每列的总和:

result = sum(values.*indices, 1) ./ sum(indices, 1);