Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 求非零元素的平均值_Matlab_Mean - Fatal编程技术网

Matlab 求非零元素的平均值

Matlab 求非零元素的平均值,matlab,mean,Matlab,Mean,我假设meanfunction取一个矩阵,将数组中的所有元素相加,然后除以元素总数来计算其平均值 但是,我使用此功能来计算矩阵的平均值。然后我遇到一个点,我不希望平均函数考虑矩阵的0个元素。具体来说,我的矩阵是1x10000数组,它的元素的1/3到1/2都是0。如果是这样的话,我可以用 null 替换0个元素,这样Matlab就不会考虑它们在计算平均值吗?我还可以做什么?要仅查找非零元素的平均值,请使用提取非零元素,然后对这些元素调用mean: mean(M(M~=0)) 短版本: 使用:

我假设
mean
function取一个矩阵,将数组中的所有元素相加,然后除以元素总数来计算其平均值


但是,我使用此功能来计算矩阵的平均值。然后我遇到一个点,我不希望平均函数考虑矩阵的0个元素。具体来说,我的矩阵是1x10000数组,它的元素的1/3到1/2都是0。如果是这样的话,我可以用<代码> null <代码>替换0个元素,这样Matlab就不会考虑它们在计算平均值吗?我还可以做什么?

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

mean(M(M~=0))
短版本:
使用:


较长的回答:
如果您使用的是具有100K条目的数组,这些条目中有大量的条目是0,那么您可以考虑使用表示形式。还应该考虑将其存储为列向量,而不是行向量

sM = sparse(M(:)); %// sparse column
mean( nonzeros(sM) ); %// mean of only non-zeros
mean( sM ); %// mean including zeros
当你问“我还能做什么?”时,这里有另一种方法,它不依赖于统计工具箱或任何其他工具箱

您可以通过将这些值相加并除以非零元素的数量(
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]

用NaN替换这些零:
mat(mat==0)=NaN
。然后使用
nanmean
。但是,如果处理浮点数,请小心,在这种情况下,您可能需要一些公差值。如果你设法解决这个问题,考虑在这个问题上发表一个答案。好的,让我试试。你用浮点数表示容忍值是什么意思?因为我要处理的是浮点数。@kuku Divakar的意思是要小心
0
的值正好是
0
,而不是像
0.00000000000000000001
那样看起来是零的一个非常小的数字,因为在执行
==0
操作时不会发现这个值,因此更应该使用
mat(abs(mat)
其中
tol
是一个很小的数字,因此,如果您只处理1D数组,Dan的解决方案应该有效。如果您使用2D或多维数组,
nanmean
可能很优雅,因为您可以指定要使用的维度,就像使用标准
mean
一样。
% // 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]