首页 > 解决方案 > 根据下标获取行平均值的快速方法

问题描述

我有一个数据,可以通过以下方式模拟:

N = 10^6;%10^8;
K = 10^4;%10^6; 

subs = randi([1 K],N,1);
M = [randn(N,5) subs];
M(M<-1.2) = nan;

换句话说,它是一个矩阵,其中最后一行是下标。现在我想计算nanmean()每个下标。我还想为每个下标保存行数。我有一个“虚拟”代码:

uniqueSubs = unique(M(:,6));
avM = nan(numel(uniqueSubs),6);
for iSub = 1:numel(uniqueSubs)
    tmpM = M(M(:,6)==uniqueSubs(iSub),1:5);
    avM(iSub,:) = [nanmean(tmpM,1) size(tmpM,1)];
end

问题是,它太慢了。我希望它适用于N = 10^8and K = 10^6(请参阅这些变量定义中的注释部分。

如何以更快的方式找到数据的平均值?

标签: matlabperformancematrixmean

解决方案


findgroups对于和来说,这听起来很完美splitapply

% Find groups in the final column
G = findgroups(M(:,6));
% function to apply per group
fcn = @(group) [mean(group, 1, 'omitnan'), size(group, 1)];
% Use splitapply to apply fcn to each group in M(:,1:5)
result = splitapply(fcn, M(:, 1:5), G);
% Check
assert(isequaln(result, avM));

推荐阅读