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