2010-09-18 8 views
3

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

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 

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

+0

Вы просто пытаетесь взять среднее значение столбца после того, как вы исключите выбросы? Можете ли вы рассказать о том, чего вы пытаетесь достичь? – linuxuser27

+0

Моя цель - принять среднее значение вершины x% от набора значений для каждой серии серий. У меня есть матрица с столбцом данных для каждого прогона и используется функция prctile для определения моего условия для каждого прогона. Хотя приведенный выше код работает, кажется, что может быть более сжатый способ выполнить эту задачу. – user338714

ответ

1

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

x(bsxfun(@le,x,w)) = nan; 
q = nanmean(x); 
1

Я не знаю, как индексировать столбцы так, как вы хотите. Это может быть быстрее, чем цикл 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) 

Я не претендую на это более кратким.

1

Вот способ решить вашу оригинальную проблему: у вас есть массив, и вы хотите знать среднее значение верхнего 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); 

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

  • Нет связанных вопросов^_^