从您的代码中,您已经认识到 dist 矩阵是对称的
dist(i,j) = norm(cord(:,i)-cord(:,j));
dist(j,i) = dist(i,j);
您可以更改内部循环以解决此问题,并将所需计算次数减少大约一半
for j = i:size(cord,2)
此外,我们可以在每次迭代中避免dist(j,i) = dist(i,j);,并在最后通过提取dist 的上三角部分并将其转置添加到dist 矩阵中来解决对称性
dist = zeros(size(cord,2),size(cord,2));
for i = 1:size(cord,2)
for j = i:size(cord,2)
dist(i,j) = norm(cord(:,i)-cord(:,j));
end
end
dist = dist + triu(dist)';
上面的加法很好,因为主对角线全为零。
虽然它仍然表现不佳,所以我们应该利用矢量化。我们可以针对内部循环执行以下操作
dist = zeros(size(cord,2),size(cord,2));
for i = 1:size(cord,2)
dist(i,i+1:end) = sum((repmat(cord(:,i),1,size(cord,2)-i)-cord(:,i+1:end)).^2);
end
dist = dist + triu(dist)';
dist = sqrt(dist);
对于cord 中的每个元素,我们需要计算它与跟随它的所有其他元素的距离。我们用repmat 复制元素,这样我们就可以从后面的每个元素中减去它,而无需循环。将差值平方和求和并分配给dist 矩阵。我们处理对称性,然后取矩阵的平方根,完成norm运算。
使用tic 和toc,使用随机绳索 (cord = rand(3,num);) 的原始距离计算耗时约 93 秒。这个版本花了~2.8。