给定两个长度X
的向量Y
和n
表示平面上的点,以及一个邻域半径rad
,是否存在计算点的邻域矩阵的矢量化方法?
换言之,以下循环(对于大型n
)是否可以矢量化
neighborhood_mat = zeros(n, n);
for i = 1 : n
for j = 1 : i - 1
dist = norm([X(j) - X(i), Y(j) - Y(i)]);
if (dist < radius)
neighborhood_mat(i, j) = 1;
neighborhood_mat(j, i) = 1;
end
end
end
最佳答案
方法1bsxfun
基于方法-
out = bsxfun(@minus,X,X').^2 + bsxfun(@minus,Y,Y').^2 < radius^2
out(1:n+1:end)= 0
方法2
Distance matrix calculation using matrix-multiplication
基于方法(可能更快)-A = [X(:) Y(:)]
A_t = A.'; %//'
out = [-2*A A.^2 ones(n,3)]*[A_t ; ones(3,n) ; A_t.^2] < radius^2
out(1:n+1:end)= 0
方法3
有
pdist
和squareform
-A = [X(:) Y(:)]
out = squareform(pdist(A))<radius
out(1:n+1:end)= 0
进近#4
您可以使用前面的方法使用
pdist
as,但是避免使用某些逻辑索引的squareform
来获得邻域矩阵的最终输出,如下所示A = [X(:) Y(:)]
dists = pdist(A)< radius
mask_lower = bsxfun(@gt,[1:n]',1:n) %//'
%// OR tril(true(n),-1)
mask_upper = bsxfun(@lt,[1:n]',1:n) %//'
%// OR mask_upper = triu(true(n),1)
%// OR mask_upper = ~mask_lower; mask_upper(1:n+1:end) = false;
out = zeros(n)
out(mask_lower) = dists
out_t = out' %//'
out(mask_upper) = out_t(mask_upper)
注:如您所见,对于上述所有方法,我们使用的是输出的预分配一种快速的预分配方法是使用
out(n,n) = 0
并基于this wonderful blog on undocumented MATLAB
这真的应该加快这些方法!关于performance - MATLAB向量化:计算邻域矩阵,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28717278/