2014-11-08 2 views
1

Я пытаюсь вернуть среднее значение ненулевых элементов в каждом столбце в моей матрице;Средство ненулевых элементов - почему эти две попытки возвращают разные результаты?

моя первая попытка была:

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

, который возвращает тот же результат для всех столбцов, в то время как второй попытки:

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

возвращает правильный ответ.

Они выглядят идентичными мне, но, очевидно, это не так.

  1. Что пошло не так с моей первой попытки?
  2. Как я могу сделать первую версию работы?
+0

Почему бы просто не использовать noZero = mean (nonzeros (Y)) '? ['mean'] (http://www.mathworks.de/help/matlab/ref/mean.html) автоматически вычисляет средства для каждого столбца, если аргумент является матрицей. – Lumen

+1

'nonzeros (Y)' будет возвращать все ненулевые элементы в матрице, но потеряет информацию о том, из какого столбца выходил каждый элемент (длинный вектор будет на нулях) – jajdoo

+0

У вас есть 'for' в первой попытке? Вы не можете ожидать 'nonzeros (Y (:, i))' для возврата матрицы с переменным размером. – Rashid

ответ

2

Как указал на nonzeros возвращает вектор-столбец, так что вы не можете ожидать несколько средств, то же значение присваивается каждому элементу nonZero1(:,i).

Возможное решение без цикла:

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

Вот неразрушающим (без изменения входной матрицы) и метод один вкладыш -

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

Трюк очень прост - мы получить сумму вдоль каждого столбца и разделить ее на число ненулевых элементов, которые являются элементами, которые фактически способствовали суммированию. Кроме того, поскольку mean внутренне вызывает sum, поэтому мы избегаем одного вызова функции с помощью этой техники!

Смежные вопросы