2012-01-21 5 views
4

У меня есть массив, который может быть любого размера (в строках), но всегда имеет ширину в два столбца. Я хотел бы выбросить любые строки, содержащие числа, которые отклоняются более чем на 1 из медианы каждого столбца.Удалите строки массива, если выполнены определенные критерии

Например:

array = 
2 5 
3 4 
9 5 
2 8 
3 5 
. . 
. . 
. . 
etc 

В приведенном выше примере, средний (массив) дает [2 5]. Таким образом, для столбцов выше, я ожидал бы, что третья и четвертая строки будут устранены, поскольку строка три содержит 9 в первом столбце, а четвертая строка содержит 8 во втором столбце, оба из которых находятся за пределами моего предела (1 прочь от медианы). Обратите внимание, что я хочу выбросить BOTH столбцы, если столбец EITHER содержит число, которое не находится в пределах 1 от медианы для этого столбца.

Любая помощь будет принята с благодарностью ...

ответ

4

Я не имею MATLAB прямо сейчас, но я думаю, что это должно работать. Вы должны, по крайней мере, следовать логике.

med = median(arrray); 
arrayNew = array((abs(array(:,1)-med(1))<=1) & (abs(array(:,2)-med(1))<=2), :); 

Вышеприведенный код делает, найти все индексы, где значение массива в как столбцов в большинстве расстояние 1 от медианы каждого столбца. Затем он выбирает только те строки, которые соответствуют этим индексам.

+0

Ваше решение тоже работает! И намного проще. Спасибо. – CaptainProg

1

Я создал решение, с некоторой помощью от this link:

function newArray = removeOutliers(oldArray, driftAllowance) 
% Remove elements from an array that are more than a certain amount from 
% the median of an old array 

r = size(oldArray, 1); % find the length of the array 
r2 = 1; % a new row index for a new table 
medianData = [3 5]; 
medianX = medianData(1); 
medianY = medianData(2); 
for i = 1 : r % for every row in the array 
    % If it is within the drift limits of the median 
    if oldArray(i,1) <= medianX + (driftAllowance/2)... 
    && oldArray(i,1) >= medianX - (driftAllowance/2)... 
    && oldArray(i,2) <= medianY + (driftAllowance/2)... 
    && oldArray(i,2) >= medianY - (driftAllowance/2) 
     newArray(r2,:) = oldArray(i,:); % add it to a new array 
     r2 = r2 + 1; % move the new row index on 
    end 
end 
Смежные вопросы