假设我有两个长度不同的向量 A 和 BLength(A) is not equal to Length(B)
并且向量 A 中的值与向量 B 中的值不同。我想将 B 的每个值与 A 的值进行比较(比较意味着值 B(i) 是否与向量 B 的值几乎相同)A(1:end)
例如B(i)-Tolerance<A(i)<B(i)+Tolerance
.
我怎样才能做到这一点而不使用for loop
因为数据很大?
I know ismember(F)
、 intersect、repmat、find 但这些功能都不能真正帮助我
您可以尝试以下解决方案:
tol = 0.1;
N = 1000000;
a = randn(1, N)*1000; % create a randomly
b = a + tol*rand(1, N); % b is "tol" away from a
a_bin = floor(a/tol);
b_bin = floor(b/tol);
result = ismember(b_bin, a_bin) | ...
ismember(b_bin, a_bin-1) | ...
ismember(b_bin, a_bin+1);
find(result==0) % should be empty matrix.
这个想法是将 a 和 b 变量离散化为大小的容器tol
。然后,询问是否在与 a 中的任何元素相同的容器中找到 b,或者在其左侧的容器中或在其右侧的容器中找到 b。
优点: 我相信ismember
里面很聪明,首先对元素进行排序a
然后对每个元素 b 执行次线性 (log(N)) 搜索。这与显式构造 b 中每个元素与 a 中元素的差异的方法不同,这意味着复杂性与 a 中元素的数量呈线性关系。
比较: for N=100000
这在我的机器上运行了 0.04 秒,而使用线性搜索则运行了 20 秒(使用艾伦的漂亮简洁的计时tf = arrayfun(@(bi) any(abs(a - bi) < tol), b);
解决方案)。
缺点:这导致实际公差为 tol 和 1.5*tol 之间的任何值。取决于您的任务是否可以忍受(如果唯一关心的是浮点比较,您可以)。
注意:这是否是可行的方法取决于 a 和 b 的范围以及 tol 的值。如果 a 和 b 可以非常大并且 tol 非常小,则a_bin
and b_bin
将无法解析单个垃圾箱(然后您将不得不使用整数类型,再次仔细检查它们的范围是否足够)。带循环的解决方案是一种更安全的解决方案,但如果您确实需要速度,则可以投资优化所提出的想法。当然,另一种选择是编写 mex 扩展。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)