用大向量计算最大距离
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
如果你想最小化距离:对A
和B
的串联进行排序,跟踪哪个元素来自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)]
好的,所以我有 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
如果你想最小化距离:对A
和B
的串联进行排序,跟踪哪个元素来自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)]