非零元素的平均值 - 为什么这两个元素会返回不同的结果?

时间:2014-11-08 10:47:46

标签: matlab matrix

我试图在矩阵的每一列中返回非零元素的均值;

我的第一次尝试是:

i = 1:peopleCount;
nonZero1(i,:) = mean(nonzeros(Y(:,i)));

为所有列返回相同的结果,而我的第二次尝试:

for i = 1:peopleCount;
    nonZero2(i) = mean(nonzeros(Y(:,i)));
end

返回正确的答案。

他们看起来和我相同,但显然,他们不是。

  1. 我第一次尝试出了什么问题?
  2. 如何让第一个版本有效?

2 个答案:

答案 0 :(得分:4)

这是非破坏性的(不改变输入矩阵)和单线方法 -

mean_col_vals = sum(Y,1)./sum(Y~=0,1)

技巧非常简单 - 我们得到每列的和,并除以非零元素的数量,这些元素实际上是对求和值的贡献。此外,由于mean内部调用sum,因此我们使用此技术避免了一个函数调用开销!

答案 1 :(得分:2)

正如您所指出的,nonzeros会返回一个列向量,因此您不能指望多种方法,而是为nonZero1(:,i)的每个元素分配相同的值。

没有循环的可能解决方案:

A        = Y(:,i);
A(A==0)  = NaN;
nonZero3 = nanmean(A,1);