2010-09-18 48 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 

我的目標是取每列的一組值的前x%的平均值。上面的代碼工作,但我只是想知道是否有一個更簡潔的方法來做到這一點?

+0

你只是想在排除異常值後採取列的意思?你能詳細說明你正在努力完成什麼嗎? – linuxuser27 2010-09-18 01:58:40

+0

我的目標是爲一系列運行中的每個運行取一組值的前x%的平均值。我有一個矩陣,每次運行都有一列數據,並使用prctile函數來確定每次運行的條件。儘管上面的代碼有效,但似乎可能有更簡潔的方式來完成此任務。 – user338714 2010-09-18 02:05:09

回答

1

你提到你正在使用的功能PRCTILE,這將表明您可以訪問Statistics Toolbox。這使您可以使用功能NANMEAN來解決您的問題。在下面的代碼,都在x某列的項小於或等於閾值w使用BSXFUN設置爲NaN,那麼每列的均值計算與NANMEAN

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

我不知道有什麼方法索引列的方式,你想要的。這可能比for循環更快,但它也會創建x的大小的矩陣y。

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); 
相關問題