gpt4 book ai didi

MATLAB:bsxfun 不清楚。想要加速线段之间的最小距离

转载 作者:太空宇宙 更新时间:2023-11-03 19:55:31 24 4
gpt4 key购买 nike

使用 MATLAB,想象一个 Nx6 的数字数组,它代表 N 个具有 3+3=6 个起始点和终点坐标的线段。

假设我有一个 function Calc_Dist( Segment_1, Segment_2 )它将两个 1x6 数组作为输入,并且在一些操作之后返回一个标量,即这两个段之间的最小欧氏距离。

我想计算列表中所有 N 段之间的成对最小距离,但希望避免双循环。

我无法理解 bsxfun 的文档 MATLAB 的功能,所以我无法完成这项工作。为了一个最小的例子(距离计算显然不正确):

function scalar = calc_dist( segment_1, segment_2 )
scalar = sum( segment_1 + segment_2 )
end

和主要

Segments = rand( 1500, 6 )
Pairwise_Distance_Matrix = bsxfun( @calc_dist, segments, segments' )

有什么办法可以做到这一点,还是我被迫使用双循环?

谢谢你的建议

最佳答案

我想你需要pdist而不是 bsxfunpdist 有两种不同的使用方式,第二种适用于您的问题:

  • 具有内置距离函数,以字符串形式提供,例如 'euclidean''hamming' 等。

  • 使用自定义距离函数,您提供的句柄。

第二种情况,距离函数

must be of the form

     function D2 = distfun(XI, XJ),

taking as arguments a 1-by-N vector XI containing a single row of X, an M2-by-N matrix XJ containing multiple rows of X, and returning an M2-by-1 vector of distances D2, whose Jth element is the distance between the observations XI and XJ(J,:).

虽然文档没有说明,但第二种方法很可能不如第一种有效(双循环甚至可能更快,谁知道呢),但您可以使用它。您需要定义您的函数,使其满足规定的条件。使用您的示例函数很容易:对于这部分您将使用 bsxfun:

function scalar = calc_dist( segment_1, segment_2 )
scalar = sum(bsxfun(@plus, segment_1, segment_2), 2);
end

还要注意

  • pdist 处理行(而不是列),这正是您所需要的。
  • pdist 通过利用任何距离函数必须具有的属性来减少操作。即,已知元素到自身的距离为零;由于对称性,每对的距离可以只计算一次。如果你想以矩阵的形式排列输出,使用squareform .

因此,在你的实际距离函数被适当修改后(这可能是最难的部分),使用:

distances = squareform(pdist(segments, @calc_dist));

例如:

N = 4;
segments = rand(N,6);
distances = squareform(pdist(segments, @calc_dist));

产生

distances =
0 6.1492 7.0886 5.5016
6.1492 0 6.8559 5.2688
7.0886 6.8559 0 6.2082
5.5016 5.2688 6.2082 0

关于MATLAB:bsxfun 不清楚。想要加速线段之间的最小距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26218334/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com