Как вычислить среднее значение определенного столбца матрицы, исключая заданное значение В MATLAB

У меня есть матрица 1000x7, столбцы которой представляют некоторые значения, равные -99.

Я хочу вычислить среднее значение каждого столбца отдельно, потому что я создаю таблицу, используя fprintf, но я хочу, чтобы среднее вычислялось без значений -99.

Например, взяв матрицу A, я пробовал

mean(A(A(:,1) ~= -99))

и он работает для вычисления среднего значения первого столбца.

Однако, когда я пытаюсь

mean(A(A(:,2) ~= -99))

для второго столбца результат точно равен результату первого столбца.

Что в этом плохого? Заранее большое спасибо за ваши советы!


person Wagner Moreira    schedule 25.03.2013    source источник


Ответы (4)


Вы берете значения индекса только в первый столбец.

Пытаться

mean(A(A(:,2) ~= -99),2) %для 2-го столбца

person Zero    schedule 25.03.2013
comment
Спасибо за ответ, но это не сработало. Это вычисляет вектор-столбец, содержащий среднее значение каждой строки, исключая случаи -99. - person Wagner Moreira; 26.03.2013

Вкратце: вам нужно указать столбец при чтении значений:

mean(A(A(:,2) ~= -99, 2))

Более длинная версия: A(:,1) ~= -99 возвращает логический массив 1000 x 1, так же как и A(:,2) ~= -99. При индексировании логических массивов Matlab эффективно сглаживает оба массива и извлекает значения, для которых логический массив равен true.

Если логический массив B имеет M элементов, а индексируемый массив A имеет N элементов, где M <= N Matlab будет работать только с первыми M элементами Bт.е. C = A(B) будет эквивалентно*

C = A(1:M);
C = C(B);

В вашем примере вы индексируете массив 1000 x 7 с логическим массивом 1000 x 1, что заставляет все вызовы учитывать только первые 1000 элементов, то есть первый столбец. Поэтому вам необходимо указать, к какому столбцу (столбцам) вы хотите применить логический индекс.

*Если B является массивом 1xM, результирующий массив также будет преобразован в массив 1xM, во всех остальных случаях возвращается массив Mx1.

person erikced    schedule 25.03.2013
comment
Спасибо за ответ. Ваше краткое объяснение относится к тому же случаю, что и поисковое кодирование не сработало. 2 в качестве второго аргумента среднего значения заставляет эту функцию вычислять средние значения строки. - person Wagner Moreira; 26.03.2013
comment
@WagnerMoreira Я случайно поставил 2 не с той стороны скобок, теперь должно быть правильно. - person erikced; 26.03.2013

Что вам нужно, это, скажем, первый столбец:

mean(A(find(A(:,1) ~= -99),1))

Например:

>> A

A =

     1     2
     1     3
   -99     4
     1     5

Затем,

>> find(A(:,1)~=-99)

ans =

     1
     2
     4

И,

>> mean(A(find(A(:,1)~=-99),1))

ans =

     1
person Roney Michael    schedule 25.03.2013
comment
@WagnerMoreira: Отлично! :) Примите ответ (или, возможно, другой, лучший), если это то, что вы искали. Это помогает пометить вопрос как решенный и, таким образом, может принести пользу сообществу. - person Roney Michael; 26.03.2013

Вы используете вектор A(:,1)~=-99 для индексации массива, поэтому он получает доступ только к значениям в первом столбце. Вот пример того, как вы можете сделать это вычисление для каждого столбца в вашем массиве:

A = [1 2 3; -99, 4, 3; 10 4 8];

for col = 1:3
    index = A(:,col) ~= -99;
    mean(A(index,col))
end
person Molly    schedule 25.03.2013
comment
Спасибо за ответ. К сожалению, я не могу использовать for в этом случае, потому что это значение должно быть вычислено внутри вызова fprintf. - person Wagner Moreira; 26.03.2013
comment
Почему это нужно вычислять внутри fprint? Назначьте переменной среднее значение и передайте ее в fprint. - person Molly; 26.03.2013