gpt4 book ai didi

list - 如何做一个集差,除了不消除重复元素

转载 作者:行者123 更新时间:2023-12-04 05:56:53 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com