gpt4 book ai didi

Matlab:比较两个具有不同长度和不同值的向量?

转载 作者:太空宇宙 更新时间:2023-11-03 20:16:30 25 4
gpt4 key购买 nike

假设我有两个长度不同的向量 A 和 B Length(A) is not equal to Length(B),并且向量 A 中的值与向量 B 中的值不同。我想将 B 的每个值与 A 的值进行比较(比较意味着如果值 B (i) 几乎与 A(1:end) 的值相同,例如 B(i)-Tolerance<A(i)<B(i)+Tolerance

由于数据量很大,我如何在不使用 for loop 的情况下执行此操作?

我知道 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。

优点:相信ismember里面比较巧妙,先对a的元素进行排序然后对每个元素 b 执行次线性 (log(N)) 搜索。这不同于明确构造 b 中每个元素与 a 中元素的差异的方法,这意味着复杂性与 a 中元素的数量成线性关系。

比较:N=100000这在我的机器上运行了 0.04 秒,而使用线性搜索需要 20 秒(使用 Alan 简洁明了的 tf = arrayfun(@(bi) any(abs(a - bi) < tol), b); 解决方案计时)。

缺点:这导致实际公差介于 tol 和 1.5*tol 之间。取决于您的任务是否可以接受(如果唯一关心的是浮点比较,您可以)。

注意:这是否可行取决于 a 和 b 的范围以及 tol 的值。如果 a 和 b 可以很大而 tol 很小,则 a_binb_bin将无法解析单个 bin(然后您将不得不使用整数类型,再次仔细检查它们的范围是否足够)。带循环的解决方案是一个更安全的解决方案,但如果你真的需要速度,你可以投资优化提出的想法。当然,另一种选择是编写 mex 扩展。

关于Matlab:比较两个具有不同长度和不同值的向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17612144/

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