Matlab 如何计算矩阵中大于零的元素的平均值
我想计算矩阵中大于零的每列元素的平均值,定义为:Matlab 如何计算矩阵中大于零的元素的平均值,matlab,matrix,Matlab,Matrix,我想计算矩阵中大于零的每列元素的平均值,定义为: G = 1 2 3 0 9 4 0 1 3 4 0 0 如果元素是ZeRo,我们将忽略它,而不考虑平均值。我的预期结果是 MeanG= 1/1 3/2 6/2 4/1 9/1 4/1 如何通过matlab代码实现这一点?对于一个相当简单的解决方案,如果您有统计工具箱,只需将所有零和负值替换为NaN,然后使用 因此: >>
G =
1 2 3 0 9 4
0 1 3 4 0 0
如果元素是ZeRo,我们将忽略它,而不考虑平均值。我的预期结果是
MeanG= 1/1 3/2 6/2 4/1 9/1 4/1
如何通过matlab代码实现这一点?对于一个相当简单的解决方案,如果您有统计工具箱,只需将所有零和负值替换为
NaN
,然后使用
因此:
>> Gnan = G;
>> Gnan(Gnan <= 0) = NaN;
>> out = nanmean(Gnan)
out =
1.0000 1.5000 3.0000 4.0000 9.0000 4.0000
这里的复杂之处在于,我们搜索那些为零或为负的元素,然后复制G
,并将此副本中的这些元素设置为零,这样这些条目就不会被添加到总和中。您必须通过除以非零或负(或仅为正)的条目总数来说明正确的平均值
请注意,我还保留了一份G
的副本,并对该副本进行变异以计算我们的平均值,因为我假设您希望保留G
的原始版本以供进一步分析
小调
朱伯斯说得很好。如果这个矩阵包含浮点数,由于精度和准确性,与像0这样的定数进行比较是非常危险的。例如,如果这是一个矩阵,其中有一些元素希望为零,但它们不是由于浮点不精确造成的,那么这将无法准确计算所需的平均值。请看这篇文章和@gnovice的这篇精彩回答,了解更多详细信息:没有工具箱依赖关系的默认解决方案可能是:
G(G<0) = 0; % // not needed if G contains only positive numbers as in your example
sum(G, 1)./sum(G~=0, 1)
ans =
1.0000 1.5000 3.0000 4.0000 9.0000 4.0000
G(G有很多方法可以做到这一点,你可以在计算平均值时找到矩阵中的零数并将其删除
z = size(A(find(A<0)))
重要问题:这个矩阵是只包含整数,还是包含浮点数?我尝试了第二个建议。它没有给出所需的输出。你的矩阵中有负值吗?如果有,你的平均值将是错误的,因为G>0不会计算这些单元格,或者你可以尝试G~=0而不是G>0;哦,对不起,没有阅读properly,您要求每列的平均值!最快的方法是sum(G,1)。/sum(G~=0,1),1表示按列进行运算求和,如果需要行,则为2。我尝试了OP建议的输入,我期望得到预期的结果。它不起作用,因为您忘记了点(
)运算符。您正在尝试使用rdivide
来找到线性方程组的解。您可能打算这样做:sum(G)。/size(G(find(G>0)),1)
。顺便说一句,您还应该重命名mean
,因为mean
在MATLAB中是一个实际函数。您会无意中对该函数进行阴影处理,因此如果您稍后尝试使用实际函数mean
,它将无法工作,因为它现在是一个变量。您在对kkuilla的注释中有它,但它在您的实际操作中没有固定我回答。谢谢rayryeng。我的矩阵包含浮点。但是,别担心。我可以使用阈值来过滤它。因此小于阈值的元素将为零。@user8264-好的,那么看起来你已经设置好了!祝你好运!这两种方法都很好,注释也非常相关here@LuisMendo-格拉西亚斯:)@Kamtal-谢谢!。。。不过,它确实需要使用统计工具箱,因此使用第二种方法更具可重复性。此外,如果您只搜索严格大于0的所有条目,并计算其中有多少条用于计算平均值,则可以简化此过程。。。说到这里,我发现了一个错误。我会更新我的帖子!
z = size(A(find(A<0)))
mean = sum(G)./size(G(find(G>0)),1)