使用bsxfun
作为两个向量的起点:
A = [2.29 2.56 2.77 2.90 2.05]
B = [2.34 2.62 2.67 2.44 2.52]
dist = abs(bsxfun(@minus,A(:),B(:).'));
[~,idx] = min(dist(:))
[ii,jj] = ind2sub( [numel(A), numel(B)], idx)
a = A(ii)
b = B(jj)
现在你可以将它放入循环中等。顺便说一下:
dist = abs(bsxfun(@minus,A(:),B(:).'));
等价于更明显的:
dist = pdist2( A(:), B(:) )
但我更倾向于采用第一种解决方案来避免额外的开销。
最后,针对多个向量的完全矢量化方法:
data{1} = [2.29 2.56 2.77 2.90 2.05];
data{2} = [2.34 2.62 2.67 2.44 2.52];
data{3} = [2.34 2.62 2.67 2.44 2.52].*2;
data{4} = [2.34 2.62 2.67 2.44 2.52].*4;
N = 5;
nans(1:numel(data)) = {NaN(N)};
mask = blkdiag(nans{:}) + 1;
X = [data{:}];
dist = mask.*abs(bsxfun(@minus,X(:),X(:).'));
[~,idx] = min(dist(:))
[ii,jj] = ind2sub( size(dist), idx)
a = X(ii)
b = X(jj)
blkdiag
想法 ;) +1, - Robert Seifert