MATLAB: выберите весь массив, ЗА ИСКЛЮЧЕНИЕМ заданных диапазонов

Я хотел бы измерить содержимое массива, которое НЕ попадает в определенные диапазоны.

Например, у меня есть массив из 1000 строк и 2 столбцов. Я хотел бы выполнить вычисление mean () для всех элементов в одном столбце (скажем, столбец № 2), которые не попадают в строки 50–150, 250–300, 400–700 и 900–950.

Таким образом, среднее значение следует рассчитывать на основе строк 1-49, 151-249, 301-399, 701-899 и 951-1000.

Есть идеи, как это сделать?

Изменить: я должен указать, что те элементы, которые включены, будут меняться каждый раз при запуске программы. Следовательно, я не могу просто жестко запрограммировать включения; они должны быть проработаны на основе исключений.


person CaptainProg    schedule 15.06.2012    source источник


Ответы (2)


Как насчет:

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

MM = M(idx,:)

Теперь примените любую функцию к отфильтрованной матрице:

mean(MM,1)
person Amro    schedule 15.06.2012
comment
Я должен отметить, что эти включения произвольны; Мне нужно, чтобы система определяла, какие включения idx основаны на знании тех, которые исключены; т.е. я не могу вручную ввести включения, так как они будут меняться в зависимости от входных данных. - person CaptainProg; 15.06.2012
comment
@CaptainProg: я добавил примечание об использовании SETDIFF - person Amro; 15.06.2012

Вы можете определить диапазоны исключения, а затем использовать логическую адресацию:

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)));
person nrz    schedule 15.06.2012
comment
возможное обобщение этого: 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 содержит нижние / верхние пределы каждого диапазона исключения - person Amro; 15.06.2012