matlab - 根据下标获取行平均值的快速方法
问题描述
我有一个数据,可以通过以下方式模拟:
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^8
and K = 10^6
(请参阅这些变量定义中的注释部分。
如何以更快的方式找到数据的平均值?
解决方案
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));
推荐阅读
- python - 有没有办法在 django 中为特定的 url 路由添加中间件?
- json - Json Xpath 匹配键与动态字符串
- python - 什么时候应该使用 while 循环和 if 语句?
- mdx - 用“0”替换空值而不更改度量的名称
- c# - 如何检查richtextfield中的值是否与line.StartsWith中的文本匹配?
- css - 在 typescript 中使用 css 模块时出错与 webpack 配置反应
- blazor - MudBlazor WASM 项目在启动时挂起
- c - 在 Visual Studio (C) 中编译期间,我无法获得正确的调试
- javascript - VSCode JSDoc of Promise
- javascript - D3 - Matplotlib 类似颜色条