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%の平均を取ることです。上記のコードは機能しますが、もっと簡潔な方法があるかどうか疑問に思っています。
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%の平均を取ることです。上記のコードは機能しますが、もっと簡潔な方法があるかどうか疑問に思っています。
希望する方法で列にインデックスを付ける方法がわかりません。これは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)
これがもっと簡潔だとは言いません。
元の問題を解決する方法は次のとおりです。配列があり、各列の上位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);
関数PRCTILEを使用しているとのことですが、これは、 StatisticsToolboxにアクセスできることを示しています。これにより、関数NANMEANを使用して、問題を解決するためのさらに別のオプションが提供されます。次のコードでは、列xのしきい値以下のすべてのエントリがBSXFUNを使用してNaNwに設定され、各列の平均がNANMEANで計算されます。
x(bsxfun(@le,x,w)) = nan;
q = nanmean(x);