Палец вверх 4
Перевод
Перевод

Удалить строки массива, если соблюдены определенные критерии

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

Например:

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

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

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

arrays matlab
задан CaptainProg 21 янв. 2012 г., 21:40:30
источник

2 ответа

Решение 4
Перевод
Перевод

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

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

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

ответ дан Phonon 21 янв. 2012 г., 22:02:03
источник
Палец вверх 1
Перевод
Перевод

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

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
ответ дан CaptainProg 21 янв. 2012 г., 22:14:56
источник