3

在 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% 的平均值。上面的代码有效,但我只是想知道是否有更简洁的方法来做到这一点?

4

3 回答 3

1

您提到您正在使用函数PRCTILE,这表明您可以访问统计工具箱。这为您提供了另一种选择,可以使用函数NANMEAN来解决您的问题。在以下代码中,x小于或等于w列阈值的所有条目都使用 BSXFUN 设置为NaN ,然后​​使用NANMEAN计算每列的平均值

x(bsxfun(@le,x,w)) = nan;
q = nanmean(x);
于 2010-09-18T04:07:27.870 回答
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)

我并不认为这更简洁。

于 2010-09-18T02:46:04.497 回答
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);
于 2010-09-18T03:28:14.580 回答