Upp*_*ide 0 arrays matlab matrix logical-operators
我基本上想使用该函数ismember,但要使用范围。例如,对于中的每个元素,我想知道哪些数据点位于array1的n距离之内。array2array2
我有以下几点:
array1 = [1,2,3,4,5]
array2 = [2,2,3,10,20,40,50]
Run Code Online (Sandbox Code Playgroud)
我想知道什么值array2是<= 2距array1:
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个元素,所以我宁愿不使用循环。
循环是此处的有效选项。将数组初始化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使用情况:
pdist2根据Luis的回答,bsxfun另一方面根据Hans的尝试,尝试创建一个34GB的中间双矩阵(它甚至不适合我的RAM,因此我无法比较时序)。ismembertol解决方案输出不同形式的解决方案,并占用〜5.04GB(在很大程度上取决于找到的匹配项的数量,越大,此数字越大)。总的来说,这使我得出结论:隐式扩展应该是您的选择,但是如果您使用R2016a或更早版本,则ismembertol可以使用循环。