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

Column-wise average over unequal number of values in matrix

我正在寻找一种简单的方法来获取矩阵中值子集的列平均(由逻辑矩阵索引),最好不必使用循环。我遇到的问题是,由于每列中值的数量不同,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)

accumarray 基于方法

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

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

注意:

  • 第二行使用(:)强制第一个输入为列向量。这是必需的,因为第一行可能会产生 col 作为行或列向量,具体取决于 indices.

  • 的大小
  • NaN用作填充值。这被指定为 accumarray.

  • 的第五个输入
  • accumarray 的第三个输入定义输出大小。如果 indices 的最后一列仅包含 false.

  • ,则有必要明确指定它(而不是让 accumarray 弄清楚)

Hacky 方法

将 element-wise 除以 indices。这会将不需要的条目变成 NaN,然后可以使用 'omitnan' 选项被 mean 忽略:

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

手动方法

将element-wise乘以indices,对每列求和,然后将element-wise除以indices每列的和:

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