поэлементная операция - MATLAB - PullRequest
3 голосов
/ 16 октября 2011

У меня есть матрица в MATLAB, скажем:

a = [
  89  79  96  
  72  51  74  
  94  88  87  
  69  47  78
]

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

спасибо

Ответы [ 3 ]

5 голосов
/ 16 октября 2011

Если ваша версия поддерживает bsxfun (что, вероятно, имеет место, если у вас очень старая версия Matlab), вы должны использовать ее, она намного быстрее, чем repmat, и потребляет гораздо меньше памяти. Вы можете просто сделать: result = bsxfun(@rdivide,bsxfun(@minus,a,mean(a)),std(a))

1 голос
/ 16 октября 2011

Вы также можете использовать функцию ZSCORE из панели инструментов статистики:

result = zscore(a)

На самом деле он вызывает BSXFUN, но осторожно, чтобы не делить на нулевое стандартное отклонение (вы можете посмотреть исходный код самостоятельно: edit zscore)

1 голос
/ 16 октября 2011

Вы можете использовать repmat, чтобы сделать ваш средний / стандартный вектор того же размера, что и исходная матрица, а затем использовать прямое вычисление следующим образом:

[rows, cols] = size(a); %#to get the number of rows

avgc= repmat(avg(a),[rows 1]); %# average by column, vertically replicated by number of rows
stdc= repmat(std(a),[rows 1]); %# std by column, vertically replicated by number of rows
%# Here, a, avgc and stdc are the same size
result= (a - avgc) ./ stdc;

Edit:

Судя по сообщению в блоге mathworks , bsxfun решение работает быстрее и потребляет меньше памяти (см. Ответ acai). Для матриц среднего размера я лично предпочитаю repmat, который облегчает чтение и отладку кода (для меня).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...