在MATLAB中,是否有一种更简洁的方法来处理列的离散条件索引,而不是使用for a loop?这是我的代码:

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%的平均值。以上代码有效,但我只是想知道是否有一种更简洁的方法?

有帮助吗?

解决方案

您提到您正在使用该功能 prctile, ,这表明您可以访问 统计工具箱. 。这为您提供了如何使用该功能解决问题的另一个选择 Nanmean. 。在以下代码中,所有条目 x 小于或等于阈值 w 对于一列设置为 使用 BSXFUN, ,然后用 Nanmean:

x(bsxfun(@le,x,w)) = nan;
q = nanmean(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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top