2013-03-25 2 views
0

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

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

Например, принимая матрицу A, я попытался

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

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

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

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

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

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

ответ

1

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

Попробуйте

mean(A(A(:,2) ~= -99),2)% для 2-й колонке

+0

Спасибо за ответ, но это не сработало. Это вычисляет вектор столбца, содержащий среднее значение каждой строки, исключая -99 случаев. –

0

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

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 
+0

Это сработало! : D Спасибо за информацию! –

+0

@WagnerMoreira: Отлично! :) Примите ответ (или, возможно, другой, лучший), если это то, что вы искали. Это помогает определить вопрос как решаемый и, таким образом, может принести пользу сообществу. –

0

Вы используете вектор, 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 
+0

Спасибо за ответ. К сожалению, я не могу использовать в этом случае, потому что это значение, которое должно вычисляться внутри вызова fprintf. –

+0

Зачем это нужно вычислять внутри fprint? Назначьте переменную в среднее значение и передайте ее в fprint. – Molly

1

Короче говоря: Вы должны указать столбец при чтении значения:

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 массива возвращается.

+0

Спасибо за ответ. Ваше короткое объяснение относится к тому же делу, что и объяснение, не работало. «2» в качестве второго аргумента «mean» делает эту функцию вычислением строки. –

+0

@WagnerMoreira Я случайно положил '2' на неправильную сторону paranthesis, должно быть правильно сейчас. – erikced

+0

Супер! Благодаря :) –

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