2

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

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

期望的结果是 AB=C=[1]

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

期望的结果是 EF=G=[5]

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

我想避免处理上面第二个例子的例子: E=[0 0 2 0 2]; F=[0 0 2 0 1];

G=EF=[0 0 0 0 1];

谢谢你的帮助!

4

2 回答 2

2

这可以通过 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 的输出将具有不同的长度。如果是这种情况,您可以将输出分配为零向量的子集,即较大向量的大小。

于 2012-02-23T06:17:47.163 回答
1

我只是想改进 Prototoast 的答案。

为了避免AB中涉及非正数的陷阱,请使用hist

A = [-10 0 1 1 2 4];
B = [1 2 4];

我们需要AB并集的最小值和最大值:

U = [A,B];
range_ = min(U):max(U);

这样我们就可以使用hist给我们相同长度的向量:

a = hist(A,range_)
b = hist(B,range_)

现在您需要减去直方图:

r = a-b

如果您希望集差运算符是对称的,则使用:

r = abs(a-b)

以下将为您提供A \ B中的哪些项目(\ 这里是您修改后的集合差异):

C = range_(logical(r))

希望这可以帮助。

于 2012-02-23T16:24:37.950 回答