我正在尝试在 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/