用大向量计算最大距离

时间:2015-02-26 17:35:54

标签: matlab optimization

好的,所以我有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。

3 个答案:

答案 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)]