如何构建没有循环的距离矩阵(矢量化)?

ahm*_*ini 4 matlab distance matrix linear-algebra vectorization

我有很多点,我想建立距离矩阵,即每个点与所有其他点的距离,但我不想使用循环,因为花太多时间...是一个更好的方法来构建这个矩阵?这是我的循环:对于一个大小为10000x3的setl,这种方法需要花费我很多时间:(

 for i=1:size(setl,1)
     for j=1:size(setl,1)        
         dist = sqrt((xl(i)-xl(j))^2+(yl(i)-yl(j))^2+...
             (zl(i)-zl(j))^2);
         distanceMatrix(i,j) = dist;
     end
 end
Run Code Online (Sandbox Code Playgroud)

A. *_*nda 18

使用一些线性代数怎么样?两个点的距离可以从它们的位置矢量的内积计算出来,

D(x,y)=∥y - x∥=√(x T x + y T y - 2 x T y),

并且可以通过简单的矩阵运算获得所有点对的内积.

x = [xl(:)'; yl(:)'; zl(:)'];
IP = x' * x;
d = sqrt(bsxfun(@plus, diag(IP), diag(IP)') - 2 * IP);
Run Code Online (Sandbox Code Playgroud)

对于10000点,我得到以下时间结果:

  • ahmad的循环+ shoelzer的预分配:7.8秒
  • 丹的矢量化指数:5.3秒
  • Mohsen的bsxfun:1.5秒
  • 我的解决方案:1.3秒