好的,所以我有2个不同长度的矢量(A和B)(在这个例子中可以说100000和300000),我希望获得具有最大差异的索引。 像这样的东西
distAB=bsxfun(@(v1,v2) abs(v1-v2),A,B));
[~,lin_indx]=max(distAB(:));
[x_indx,y_indx]=ind2sub(size(A),lin_indx)
这里的问题是我的矢量A和B太大而产生矩阵“distAB”太贵了。我希望直接用bsxfun获得min。
答案 0 :(得分:2)
如果您想最大化距离,搜索可以减少为只有两个候选对:max(A)
,min(B))
或{{1 },min(A)
。
所以试试这两对:
max(B))
如果您想最小化距离:对[ma_val, ma_ind] = min(A);
[Ma_val, Ma_ind] = max(A);
[mb_val, mb_ind] = min(B);
[Mb_val, Mb_ind] = max(B);
diff1 = abs(Mb_val-ma_val);
diff2 = abs(Ma_val-mb_val);
if diff1 > diff2
result_ind_A = ma_ind;
result_ind_B = Mb_ind;
result_value = diff1;
else
result_ind_A = Ma_ind;
result_ind_B = mb_ind;
result_value = diff2;
end
和A
的串联进行排序,跟踪哪个元素来自B
以及来自{{{} 1}}:
A
现在,使用B
循环来遍历来自C = sortrows([A(:) zeros(numel(A),1); B(:) ones(numel(B),1)] ,1);
%// C(k,2)==0 indicates element k comes from A; 1 indicates from B
的{{1}}中的所有元素。对于每个此类元素,找到位于for
中最靠近上方和左下方的C(:,1)
中的两个元素。这些是B
中距A
最接近该元素的唯一候选人。
因此,对于来自C
的每个元素,您有两个来自A
的候选元素,这会显着降低问题的复杂性。
答案 1 :(得分:1)
您可以使用内置的distAB
以这种方式计算@minus
,这可能更有效 -
distAB = abs(bsxfun(@minus,A(:).',B(:)))
答案 2 :(得分:1)
Luis 的排序方法可能是最快的。但是,如果安装了统计工具箱,则可以使用函数knnsearch
,这样可以提供简单而有效的解决方案。
(在文件交换中也有一些类似的免费版本。查找:kd tree nearest neighbor)
此解决方案的另一个好处是它也适用于2D,3D,...,nD数据。
[Is, D] = knnsearch(A,B,'K',1);
[~,j] = min(D); i = Is(j);
[A(i), B(j)]