我假设mean
函数采用矩阵并通过对数组的所有元素求和来计算其均值,并将其除以元素的总数。
但是,我正在使用此功能来计算矩阵的平均值。然后我遇到了一个我不希望平均函数考虑我的矩阵的0个元素的点。具体来说,我的矩阵是1x100000数组,并且它的元素的1/3到1/2都是0.如果是这种情况,我可以用NULL
替换0元素,这样matlab就不会在计算均值时考虑它们?我还能做什么?
答案 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))