2014-11-08 3 views
1

매트릭스의 각 열에 0이 아닌 원소의 평균을 반환하려고합니다.0이 아닌 요소의 평균 -이 두 시도가 다른 결과를 반환하는 이유는 무엇입니까?

내 첫 번째 시도했다 :

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

는 정답을 반환 : 내 두 번째 시도하면서

모든 컬럼에 대해 동일한 결과를 반환
i = 1:peopleCount; 
nonZero1(i,:) = mean(nonzeros(Y(:,i))); 

.

그들은 저와 똑같아 보이지만 명백하게는 그렇지 않습니다.

  1. 첫 번째 시도에서 무엇이 잘못 되었습니까?
  2. 첫 번째 버전을 어떻게 만들 수 있습니까? 당신이 지적 여러 수단을 기대하지 수 있도록 nonzeros는 열 벡터를 다시 제공으로
+0

왜 'nonZero = mean (nonzeros (Y))'가 아닌가? ['mean'] (http://www.mathworks.de/help/matlab/ref/mean.html)은 인수가 행렬 인 경우 각 열의 평균을 자동으로 계산합니다. – Lumen

+1

'nonzeros (Y)'는 행렬에있는 모든 0이 아닌 요소를 반환하지만 각 요소가 어떤 열에서 왔는지에 대한 정보를 잃어 버릴 것입니다 (긴 벡터는 모두 0입니다) – jajdoo

+0

첫 번째 시도에서'for'가 있습니까? 'nonzeros (Y (:, i))'가 가변 크기의 행렬을 반환한다고 기대할 수는 없습니다. – Rashid

답변

2

는 같은 값은 nonZero1(:,i)의 모든 요소에 할당됩니다.

루프없이 가능한 용액 : 여기

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

는 (입력 매트릭스를 변경하지 않고) 비파괴 그리고 한 라이너 방법 -

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

트릭 매우 간단 - 우리 각 열을 따라 합계를 구하고 합계 값에 실제로 기여한 요소 인 0이 아닌 요소의 수로 나눕니다. 또한 mean은 내부적으로 sum을 호출하므로이 기술로 인해 하나의 함수 호출 오버 헤드를 피할 수 있습니다!

관련 문제