list - 如何进行设置差异,除非不消除重复元素

标签 list matlab set-difference

我正在尝试在 Matlab 中执行以下操作。获取两个可能包含重复元素的数字列表,然后从另一组中减去一组。

例如:A=[1 1 2 4]; B=[1 2 4];

期望的结果是 A-B=C=[1]

或者,另一个例子,E=[3 3 5 5]; F=[3 3 5];

期望的结果是 E-F=G=[5]

我希望我可以使用 Matlab 的集合运算来完成此操作,但它们的函数 setdiff 不考虑矩阵中的重复元素。我很欣赏从严格的集合论角度来看这是正确的,但仍然想解决这样的问题:“我有 3 个苹果和 4 个橙子,你拿 2 个苹果和 1 个橙子,我还剩下多少个。”我在这些集合中的可能值范围有数千个,因此出于速度原因,构建一个大型矩阵来计算元素然后减去矩阵似乎并不可行。在 GUI 菜单操作期间,我必须使用数千个集合元素进行数千次这样的计算。

在处理上面的第二个示例时我希望避免的示例: E=[0 0 2 0 2]; F=[0 0 2 0 1];

G=E-F=[0 0 0 0 1];

感谢您的帮助!

最佳答案

这可以使用 Accumarray 命令来完成。

A = [1 1 2 4]';
B = [1 2 4]';  % <-make these column vectors

X = accumarray(A, 1);
Y = accumarray(B, 1); 

这将产生输出

X = [2 1 0 1]'

Y = [1 1 0 1]'

其中X(i)表示向量A中第i个事件的次数,Y(i)表示向量B中第i个事件的次数。

然后你就可以取 X - Y。

需要注意的是:如果 A 和 B 的最大值不同,accummarray 的输出将具有不同的长度。如果是这种情况,您可以将输出指定为零向量的子集,即较大向量的大小。

关于list - 如何进行设置差异,除非不消除重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9407768/

相关文章:

matlab - 在噪声图像中检测小 Blob 的技术

matlab - 根据每个元素在矩阵中出现的频率创建权重矩阵的最简单方法是什么?

c++ - 保持顺序的 vector 差异

c# - 如何创建一个方法列表然后执行它们?

list - Dart 如何克隆 map 列表

matlab - 使用 MATLAB 实现视频稳定

ruby - 如何在 Ruby 中做 sane "set-difference"?

r - 在 R 中查找对称差异(与交叉点相反)的函数?

list - 绝对第一次使用scheme,简单的列表操作

R:for 循环或 lapply 到命名列表的某些元素