如果满足特定条件,则删除数组行

时间:2012-01-21 17:40:30

标签: arrays matlab

我有一个数组,可以是任何大小(行),但总是两列宽。我想扔掉任何包含从每列中位数偏离1的数字的行。

例如:

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

在上面的例子中,中位数(数组)给出[2 5]。因此,对于上面的列,我希望第三行和第四行被删除,因为第三行在第一列中包含9,第四行在第二列中包含8,两者都超出了我的限制(1从中位数)。请注意,如果EITHER列包含的数字不在该列的中位数的1之内,我想丢弃BOTH列。

非常感谢任何帮助......

2 个答案:

答案 0 :(得分:4)

我现在没有MATLAB,但我认为这应该有效。你应该能够至少遵循逻辑。

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

上面的代码正在做的是找到所有索引,其中两个列中的数组值与每列的中位数最多为1。然后它只选择那些与这些索引相对应的行。

答案 1 :(得分: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