【发布时间】:2014-09-03 15:27:42
【问题描述】:
我正在寻找有关如何优雅地解决以下问题的建议。虽然在我的具体情况下性能不是问题,但我会感谢 cmets 提供的良好做法。
提前致谢!
短版:
我正在尝试根据某些逻辑对矩阵行进行平均,同时忽略 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”,其余部分表示“未被 NaN 破坏”,例如:
- 如果对于特定的列+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 ];
附言
- 如果使用电子表格软件(如 MS Excel)更容易做到这一点 - 我很想听听意见。
- 在每列的基础上进行计算是我目前关于如何处理这个问题的想法。我只是想知道是否有一种方法可以对其进行泛化以立即获取完整的矩阵。
【问题讨论】:
-
+1 用于明确提出的问题。如果只有新用户提出这样的问题:)
-
@Amro & rayryeng - 谢谢大家。这是因为我不认为用不恰当的问题折磨潜在读者是获得答案的好方法 :) 和 rayryeng - 如果你有其他解决方案,我不介意听到它!
-
@Luis - 让我在 meta 上快速提出这个建议......:D
-
@Dev-iL 你肯定会得到我的投票! :-)
-
@Dev-iL - 这是一个很好的问题,得到了很好的回答 - stackoverflow.com/questions/24269516/…。我的最爱之一,由我们的常驻专家 Luis Mendo 回答
标签: matlab nan accumarray