寻找靠近空间中另一个数组的数组元素?

Upp*_*ide 0 arrays matlab matrix logical-operators

我基本上想使用该函数ismember,但要使用范围。例如,对于中的每个元素,我想知道哪些数据点位于array1n距离之内。array2array2

我有以下几点:

array1 = [1,2,3,4,5]
array2 = [2,2,3,10,20,40,50]
Run Code Online (Sandbox Code Playgroud)

我想知道什么值array2<= 2array1

indices(1,:) (where array1(1) = 1)     = [1 1 1 0 0 0 0]
indices(2,:) (where array1(2) = 2)     = [1 1 1 0 0 0 0]
indices(3,:) (where array1(3) = 3)     = [1 1 1 0 0 0 0]
indices(4,:) (where array1(4) = 4)     = [1 1 1 0 0 0 0]
indices(5,:) (where array1(5) = 5)     = [0 0 1 0 0 0 0]
Run Code Online (Sandbox Code Playgroud)

缺点:

array1是496736个元素,我array2是9268个元素,所以我宁愿不使用循环。

Adr*_*aan 6

循环是此处的有效选项。将数组初始化output为的大小array1 X array2,然后在所有元素array1的减法中循环array2,然后检查绝对值是否小于或等于2

array1 = [1,2,3,4,5];
array2 = [2,2,3,10,20,40,50];

output = zeros(numel(array1), numel(array2),'logical');

for ii = 1:numel(array1)
   output(ii,:) = abs(array1(ii)-array2)<=2;
end
output =

     1     1     1     0     0     0     0
     1     1     1     0     0     0     0
     1     1     1     0     0     0     0
     1     1     1     0     0     0     0
     0     0     1     0     0     0     0
Run Code Online (Sandbox Code Playgroud)

即循环不是问题。

感谢Rahnema1的建议,您可以output直接初始化为逻辑矩阵:

output = zeros(numel(array1),numel(array2),'logical');
Run Code Online (Sandbox Code Playgroud)

大小仅为4.3GB。


在时间安排上:Hans的代码在array1 = 5*rand(496736,1); array2 = 25*rand(9286,1);大约几秒钟内即可运行,循环解决方案的时间大约要长15倍。两种解决方案彼此相等。obcahrdon的ismembertol解决方案介于我的机器之间。


关于RAM使用情况:

  • 根据Hans的回答,这两种隐式扩展,以及在我的工作中建议的循环(扩展后的问题大小,仅4.3GB RAM)(496736 * 9286)
  • pdist2根据Luis的回答bsxfun另一方面根据Hans的尝试,尝试创建一个34GB的中间双矩阵(它甚至不适合我的RAM,因此我无法比较时序)。
  • obchardon的ismembertol解决方案输出不同形式的解决方案,并占用〜5.04GB(在很大程度上取决于找到的匹配项的数量,越大,此数字越大)。

总的来说,这使我得出结论:隐式扩展应该是您的选择,但是如果您使用R2016a或更早版本,则ismembertol可以使用循环。