MATLAB:选择数组中除给定范围外的所有元素

3
我想对数组的内容进行度量,但不包括特定范围内的内容。
例如,我有一个1000行2列的数组。我想在其中一列(假设是第二列)中执行mean()计算,但不包括50-150、250-300、400-700和900-950之间的行。
因此,平均值应基于第1-49、151-249、301-399、701-899和951-1000行计算。
您有什么好的建议吗?
编辑:我应指出,每次运行程序时都会更改包含的项目。因此,我不能将它们硬编码进去;必须根据排除情况来计算它们。
2个回答

6
如何呢?
M = rand(1000,2);
idx = setdiff(1:size(M,1), [50:150, 250:300, 400:700, 900:950]);

MM = M(idx,:)

现在将任何函数应用于过滤后的矩阵:
mean(MM,1)

我应该指出,这些包含是任意的;我需要让系统能够根据已知的排除项来确定“idx”包含项是什么;也就是说,我不能手动输入包含项,因为它们将根据输入数据而变化。 - CaptainProg
@CaptainProg:我添加了一个关于使用SETDIFF的注释。 - Amro

0

您可以定义排除范围,然后使用逻辑寻址:

LowerLimit1 = 1;
UpperLimit1 = 50;

LowerLimit2 = 151;
UpperLimit2 = 249;

LowerLimit3 = 301;
UpperLimit3 = 399;

LowerLimit4 = 701;
UpperLimit4 = 899;

LowerLimit5 = 951;
UpperLimit5 = 1000;

MyVector = MyMatrix(:,2);

MeanValue = mean(MyVector(~(MyVector > LowerLimit1 & MyVector < UpperLimit1) | (MyVector > LowerLimit2 & MyVector < UpperLimit2) |  (MyVector > LowerLimit3 & MyVector < UpperLimit3)  | (MyVector > LowerLimit4 & MyVector < UpperLimit4) | (MyVector > LowerLimit5 & MyVector < UpperLimit5)));

1
可能的一般化形式为:r = [50 150; 250 300; 400 700; 900 950]; idx = find(all( ~(bsxfun(@ge, 1:size(M,1), r(:,1)) & bsxfun(@le, 1:size(M,1), r(:,2))) )); 其中 r 包含每个排除范围的下限/上限。 - Amro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接