求非零元素的平均值

时间:2014-10-29 06:33:07

标签: matlab mean

我假设mean函数采用矩阵并通过对数组的所有元素求和来计算其均值,并将其除以元素的总数。

但是,我正在使用此功能来计算矩阵的平均值。然后我遇到了一个我不希望平均函数考虑我的矩阵的0个元素的点。具体来说,我的矩阵是1x100000数组,并且它的元素的1/3到1/2都是0.如果是这种情况,我可以用NULL替换0元素,这样matlab就不会在计算均值时考虑它们?我还能做什么?

3 个答案:

答案 0 :(得分:8)

简短版本:
使用nonzeros

mean( nonzeros(M) );

答案较长:
如果您正在使用具有100K条目的数组,并且大量这些条目为0,则可以考虑使用sparse表示。将它存储为列向量而不是行向量也可能值得考虑。

sM = sparse(M(:)); %// sparse column
mean( nonzeros(sM) ); %// mean of only non-zeros
mean( sM ); %// mean including zeros

答案 1 :(得分:4)

正如您所要求的那样"我还能做什么?",这是另一种方法,它不依赖于统计工具箱或任何其他工具箱。

您可以通过将值相加并除以非零元素的数量(nnz())来计算它们。由于求零并不影响总和,因此这将给出期望的结果。对于一维情况,正如您所看到的那样,可以按照以下方式完成:

% // 1 dimensional case
M = [1, 1, 0 4];
sum(M)/nnz(M) % // 6/3 = 2

对于二维情况(或n维情况),您必须指定总和应该发生的维度

% // 2-dimensional case (or n-dimensional)
M = [1, 1, 0, 4
      2, 2, 4, 0
      0, 0, 0, 1];

% // column means of nonzero elements      
mean_col = sum(M, 1)./sum(M~=0, 1) % // [1.5, 1.5, 4, 2.5]

% // row means of nonzero elements
mean_row = sum(M, 2)./sum(M~=0, 2) % // [2; 2.667; 1.0]

答案 2 :(得分:3)

要仅查找非零元素的平均值,请使用logical indexing提取非零元素,然后在这些元素上调用mean

mean(M(M~=0))