2014-10-29 176 views
3

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

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

+3

用NaN替换那些零:'mat(mat == 0)= NaN'。然后使用'nanmean'。如果你正在处理浮点数,那么要小心,在这种情况下,你需要一些容差值。如果你设法解决它,考虑发布一个答案。 – Divakar 2014-10-29 06:34:13

+0

好的,让我试试看。 – kuku 2014-10-29 06:34:37

+0

容差值与浮点数是什么意思?因为我正在处理的是浮动号码。 – kuku 2014-10-29 06:38:20

回答

3

只查找非零元素的平均值,用logical indexing提取非零元素,然后调用mean那些:

mean(M(M~=0)) 
7

短版:
使用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 
4

正如您问“我还能做什么?”,这里提供了另一种方法,它不依赖于统计工具箱或任何其他工具箱。

您可以通过总结这些值并除以非零元素的数量(nnz())来计算它们的意思。由于总计零并不影响总和,所以这会得到期望的结果。对于一维情况下,如你似乎有它,这可以如下完成:

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

为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]