2010-08-03 2 views
3

Я пытаюсь взять матрицу и нормализовать значения в каждой ячейке вокруг среднего для этого столбца. Нормализовать я имею в виду вычесть значение в каждой ячейке из среднего значения в этом столбце, то есть вычесть среднее значение для столбца 1 из значений в столбце 1 ... вычесть среднее значение для столбца N из значений в столбце N. Я ищу сценарий в Matlab. Благодаря!Как нормализовать данные вокруг среднего значения для столбца в MATLAB?

+4

... и пользователи MATLAB по всему миру поднимают руки и говорят «о, оооооо, я знаю это!» – Doresoom

+2

@Doresoom ... слишком плохо Google-читатель так медленно при доставке каналов. – JudoWill

ответ

3

Попробуйте функцию mean для начала. Передача матрицы к ней приведет к усреднению всех столбцов и возвращает вектор строки.

Затем вы должны вычесть среднее значение. Чтобы сделать это, матрицы должны быть одного размера, поэтому используйте repmat для вашего вектора средних строк.

a=rand(10); 
abar=mean(a); 
abar=repmat(abar,size(a,1),1); 
anorm=a-abar; 

или один вкладыш:

anorm=a-repmat(mean(a),size(a,1),1); 
10

Вы можете использовать функцию mean, чтобы получить среднее значение каждого столбца, то функция bsxfun вычитать, что из каждой колонки:

M = bsxfun(@minus, M, mean(M, 1)); 

Кроме того, начиная с версии R2016b, вы можете воспользоваться тем фактом, что MATLAB будет выполнять implicit expansion операндов до нужного размера для арифм этической операции. Это означает, что вы можете просто сделать это:

M = M-mean(M, 1); 
+0

как бы переключить его, чтобы иметь значение строк – Spencer

+0

@Spencer: вам просто нужно добавить ', 2' к вызову MEAN, чтобы вычесть средства строк из каждой строки, например:' M = bsxfun (@ minus, M, mean (M, 2)); ' – gnovice

+0

+1 для bsxfun (самое странное имя, которое я видел в то время для полезной функции!) –

1
% Assuming your matrix is in A 
m = mean(A); 
A_norm = A - repmat(m,size(A,1),1) 
+0

Ум, вопрос, по-видимому, заключался в вычитании среднего значения. Ваш ответ ДИВИДЕТСЯ по среднему значению. Да, слово normalize было использовано, но оно было явно определено. – 2010-08-03 19:03:54

1

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

Так попробуйте это:

a = magic(4) 
b = a - repmat(mean(a),[size(a,1) 1]) % subtract columnwise mean from elements in a 

repmat размножается среднее в соответствии с размерами данных.