我有一个数组,可以是任何大小(行),但总是两列宽。我想扔掉任何包含从每列中位数偏离1的数字的行。
例如:
array =
2 5
3 4
9 5
2 8
3 5
. .
. .
. .
etc
在上面的例子中,中位数(数组)给出[2 5]。因此,对于上面的列,我希望第三行和第四行被删除,因为第三行在第一列中包含9,第四行在第二列中包含8,两者都超出了我的限制(1从中位数)。请注意,如果EITHER列包含的数字不在该列的中位数的1之内,我想丢弃BOTH列。
非常感谢任何帮助......
答案 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