【问题标题】:Removing elements meeting criteria in both arrays MATLAB删除两个数组中满足条件的元素 MATLAB
【发布时间】:2019-08-19 20:52:03
【问题描述】:

我有两个长度不等的数组。假设 A 的长度较长,B 的长度较短。我希望从 A 和 B 中删除符合标准的所有元素 - 如果 A 中有一个值介于 B 中的值的 +/- 0.1 之间,则从 A 和 B 中删除该元素。仅删除尽可能多的值从 A 到 B - 即,可以有非唯一元素。如果有多个元素可以等价地从 A & B 中移除,请先移除 B 中较小的元素,然后再移除 A 中较大的元素。

例子:

A = [ 1 2 3 3 4 ]
B = [ 3.1, 2.9, 5]

然后从 A 中删除 3 和 3,从 B 中删除 3.1 和 2.9。

如何在 MATLAB 中执行此操作?

【问题讨论】:

  • 这个问题是解决方案不是唯一的。考虑A=[1 2 3 3 4], B=[3.1, 3.05, 2.9]:您可以从B 中删除任意两个 元素。或者,对于更复杂的示例,A=[1 2 3 3.1 4], B=[3.1, 2.9, 5]:您可以从B 中删除3.1,并从A 中配对3,然后您就被卡住了。但是,如果您从B 中删除2.9,并从A 中删除3,您可以继续删除另一对(从A 中删除3.1,从B 中删除3.1)。所以我想说这个问题没有很好的定义。您需要指定您使用哪些解决方案/程序
  • @LuisMendo 好点。我们总是先删除 B 的较低值。所以 2.9 用 3 删除,然后 3.1 用 3.1 删除
  • B 的低位是否与A 的低位一起被删除?也就是说,对两个数组进行排序并在每个数组上从左到右进行?
  • @LuisMendo 较低的 B 和较大的 A 。
  • 您可能需要对已排序的数组应用一个循环,在每次迭代中从每个数组中删除一个元素,然后为下一次迭代处理缩减后的数组

标签: arrays matlab sorting


【解决方案1】:

你可以使用ismembertol:

A = [ 1 2 3 3 4 ];
B = [ 3.1, 2.9, 5];

Aind = ismembertol(A,B,0.1);
Bind = ismembertol(B,A,0.1);

A(Aind) = [];
B(Bind) = [];

ismembertol 使用容差(在本例中为 0.1)进行比较

类似的结果也可以通过以下方式实现:

lim = 0.1+10^-10 % +10^-10 so we avoid the floating point precision error.

Aind = any(abs(A-B.')<=lim,1)
Bind = any(abs(A-B.')<=lim,2)

A(Aind) = []
B(Bind) = []

注意到第二种解决方案的内存效率不高。它只适用于小数组,因为它创建了一个length(A)*length(B) 矩阵。

【讨论】:

    猜你喜欢
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    相关资源
    最近更新 更多