我有一个数组,它可以是任何大小(行),但总是两列宽。我想丢弃任何包含偏离每列中值超过1的数字的行。
例如:
array =
2 5
3 4
9 5
2 8
3 5
. .
. .
. .
etc
在上面的例子中,中位数(数组)给出[25]。因此,对于上面的列,我希望删除第三行和第四行,因为第三行在第一列中包含9,第四行在第二列中包含8,这两个行都超出了我的限制(距离中值1)。请注意,如果其中一列包含的数字不在该列中值的1以内,则我希望丢弃BOTH列。
任何帮助都将不胜感激。。。
我现在没有MATLAB,但我认为这应该可以工作。你至少应该能够遵循逻辑。
med = median(arrray);
arrayNew = array( ( abs(array(:,1)-med(1))<=1 ) & ( abs(array(:,2)-med(1))<=2 ), : );
上面的代码所做的是找到所有索引,其中两个列中的数组值与每列的中值的距离最多为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