Есть ли в MATLAB векторный способ работы с разным количеством значений на столбец? - PullRequest
3 голосов
/ 18 сентября 2010

Есть ли в MATLAB более лаконичный способ обработки дискретной условной индексации по столбцам, чем при использовании цикла for?Вот мой код:

x=[1 2 3;4 5 6;7 8 9];
w=[5 3 2];

q=zeros(3,1);
for i = 1:3
    q(i)=mean(x(x(:,i)>w(i),i));
end
q

Моя цель - взять среднее из верхнего x% набора значений для каждого столбца.Приведенный выше код работает, но мне просто интересно, есть ли более краткий способ сделать это?

Ответы [ 3 ]

1 голос
/ 18 сентября 2010

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

%# make up some data
data = magic(5);

%# find out how many rows the top 40% are
nRows = floor(size(data,1)*0.4);

%# sort the data in descending order
data = sort(data,1,'descend');

%# take the mean of the top 20% of values in each column
topMean = mean(data(1:nRows,:),1);
1 голос
/ 18 сентября 2010

Вы упомянули, что используете функцию PRCTILE , которая указывает на то, что у вас есть доступ к Statistics Toolbox .Это дает вам еще одну возможность для решения вашей проблемы, используя функцию NANMEAN .В следующем коде все записи в x, меньшие или равные пороговому значению w для столбца, установлены на NaN с использованием BSXFUN , а затем среднего значения для каждого столбцавычисляется с NANMEAN :

x(bsxfun(@le,x,w)) = nan;
q = nanmean(x);
1 голос
/ 18 сентября 2010

Я не знаю, как индексировать столбцы так, как вы хотите.Это может быть быстрее, чем цикл for, но также создает матрицу y размером x.

x=[1 2 3;4 5 6;7 8 9];
w=[5 3 2];

y = x > repmat(w,size(x,1),1);
q = sum(x.*y) ./ sum(y)

Я не утверждаю, что это более лаконично.

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