繁体   English   中英

使用numpy加速顶点距离计算的方法

[英]Way of speeding up a vertex distance calculation using numpy

我一直在努力使用与3d三角矢量比较相关的算法。 不幸的是,它的位置非常慢,我在不同的方法上来回走动,试图改进它。 我正在努力的一件事是加快距离计算。

我有两组三角形,它们被分解为三个点,每个点都有一个3d浮动矢量(xyz)。 我正在使用的计算是:

    diffverts = numpy.zeros( (  ntris*3, ntesttris*3, 3 ), dtype = 'float32')
    diffverts += triverts.reshape(ntris*3, 1, 3 )
    diffverts -= ttriverts.reshape(1, ntesttris*3, 3 )
    vertdist = ( diffverts[:,:,0]**2 + diffverts[:,:,1]**2 + diffverts[:,:,2]**2 ) ** 0.5

这个计算比以下更快:

    diffverts = triverts.reshape(ntris*3, 1, 3 ) - ttriverts.reshape(1, ntesttris*3, 3 )
    vertdist = ( diffverts[:,:,0]**2 + diffverts[:,:,1]**2 + diffverts[:,:,2]**2 ) ** 0.5

是否有更快的方法来填充差异部分(需要更长时间)和/或距离部分,这也是非常耗时的? 由于要测试的组的数量,此代码被多次调用。 此外,尝试仅对顶点的索引执行此操作会导致我在尝试返回某些布尔测试时进一步计算的其他问题(即,这只是一组计算中的一个,因此保持三点水平最佳。

我正在使用numpy和python

问题是所有三角形相对于彼此的强力测试需要二次时间。 最好使用专门用于执行此类计算的数据结构。 幸运的是,scipy包含一个。

看看scipy.spatial.cKDTree。 帮助应该是不言自明的。

我认为diffverts占用了足够的内存来导致缓存未命中。 不幸的是,虽然这个解决方案非常优雅,但您最好一次性计算整个距离,以避免必须保存n * m * 3中间值数组。 虽然很丑,但我会做嵌套for循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM