我正在寻找有关如何优雅地解决以下问题的建议。尽管在我的具体情况下性能不是问题,但我会感谢有关良好实践的评论。
提前致谢!
简短版本:
我试图根据一些逻辑对矩阵行进行平均,同时忽略 NaN 值。我目前拥有的代码没有按照我想要的方式处理 NaN 值。
长版:
我的数据是按以下方式构建的:
- 单个(第一)列“箱”。每个 bin 的行数不是恒定的。箱不必是整数。行是预先排序的。
- 可变数量的数据列,可能包括 NaN。
这是一个例子:
DATA = [...
180 NaN NaN 1.733
180 NaN NaN 1.703
200 0.720 2.117 1.738
200 0.706 2.073 1.722
200 0.693 2.025 1.723
200 NaN NaN 1.729
210 NaN NaN 1.820
210 NaN NaN 1.813
210 NaN NaN 1.805
240 NaN NaN 1.951
240 NaN NaN 1.946
240 NaN NaN 1.946
270 NaN NaN 2.061
270 NaN NaN 2.052
300 0.754 2.356 2.103
300 0.758 2.342 2.057
300 NaN NaN 2.066
300 NaN NaN 2.066 ];
所需的结果是一个矩阵,其中包含第一列中唯一的“bins”,其余部分表示“未被 NaNs 破坏”,例如:
- 如果对于特定列+bin,只有 NaN(在上面的示例中:第一个数据列+bin 210) - 结果将是 NaN。
- 如果对于特定的列+bin,存在 NaN 和数字的混合,则结果将是有效数字的平均值。在上面的例子中:第一个数据列+bin 200 应该给出
(0.720+0.706+0.693)/3=0.7063
——注意这个列+bin 除以 3(而不是 4)。
这是上述示例的预期结果:
RES = [...
180 NaN NaN 1.718
200 0.7063 2.072 1.728
210 NaN NaN 1.812
240 NaN NaN 1.948
270 NaN NaN 2.056
300 0.756 2.349 2.074 ];
到目前为止我尝试了什么:
这是我设法从多个来源编译的一些代码。它适用于仅包含 NaN 或数字的 column+bin。
nDataCols=size(DATA,2)-1;
[u,m,n] = unique(DATA(:,1));
sz = size(m);
N=accumarray(n,1,sz);
RES(length(u),nDataCols) = 0; %Preallocation
for ind1 = 1:nDataCols
RES(:,ind1)=accumarray(n,DATA(:,ind1+1),sz)./N;
end
RES= [u,RES];
这是我目前得到的:
RES = [...
180 NaN NaN 1.718
200 NaN NaN 1.728
210 NaN NaN 1.812
240 NaN NaN 1.948
270 NaN NaN 2.056
300 NaN NaN 2.074 ];
ps
- 如果有任何机会使用电子表格软件(如 MS Excel)更容易做到这一点 - 我很想听听想法。
- 在每列的基础上进行计算是我目前关于如何处理这个问题的想法。我只是想知道是否有一种方法可以概括它以立即获取完整的矩阵。