用大向量计算最大距离

calculate maximum distance with large vectors

好的,所以我有 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 获取最小值。

您可以使用内置的 @minus 以这种方式计算 distAB,这可能更有效 -

distAB = abs(bsxfun(@minus,A(:).',B(:)))

如果你想最大化距离,搜索可以减少到只有两个候选对max(A)min(B))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

如果你想最小化距离:对AB的串联进行排序,跟踪哪个元素来自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

现在,使用 for 循环遍历 C(:,1) 中来自 B 的所有元素。对于每个这样的元素,找到 A 中最接近 C 左上方和左下方的两个元素。这些是 A 中唯一最接近 A.

中的元素的候选者

因此对于 B 中的每个元素,您有两个来自 A 的候选元素,这显着降低了问题的复杂性。

Luis' 排序方法可能是最快的。但是如果你安装了统计工具箱,你可以使用函数 knnsearch,这是一个简单而有效的解决方案。 (在 File Exchange 上也有一些类似的免费版本。寻找:kd tree nearest neighbor

此解决方案的一个额外好处是它也适用于 2D、3D、...、nD 数据。

[Is, D] = knnsearch(A,B,'K',1);
[~,j] = min(D); i = Is(j);
[A(i), B(j)]