记录一下,hypermesh二次开发项目中实际遇到的问题,寻找两组节点之间的最近距离。
之前都是使用Tcl的循环加循环方式来计算最近距离。数据量小感受不出慢。但用上这个项目的数据,两组节点分别10000个,程序运行的时间复杂度为O (n^2),需要循环100,000,000次。
大力出奇迹版本
# 定义两组3D节点的坐标set nodes1 {{1 2 3} {4 5 6} {7 8 9}}set nodes2 {{10 11 12} {13 14 15} {16 17 18}}# 计算两组节点之间的最短距离set minDistance 1e9 ;# 初始值设为一个较大的数# 遍历两组节点的所有组合,计算距离foreach node1 $nodes1 {foreach node2 $nodes2 {set dx [expr [lindex $node2 0] - [lindex $node1 0]]set dy [expr [lindex $node2 1] - [lindex $node1 1]]set dz [expr [lindex $node2 2] - [lindex $node1 2]]set distance [expr {sqrt($dx*$dx + $dy*$dy + $dz*$dz)}]if {$distance < $minDistance} {set minDistance $distance}}}# 输出最短距离puts "最短距离为: $minDistance"
后面听着电脑风扇呜呜呜的响起,于是,转用Python来重新实现这个任务。同样的数据量不到一秒就计算出来了。
python的矩阵运算版本
import numpy as npdef calculate_min_distance(nodes1, nodes2):matrix1 = np.array(nodes1)matrix2 = np.array(nodes2)distance_matrix = np.sqrt(np.sum((matrix1[:, np.newaxis] - matrix2)**2, axis=-1))min_distance = np.min(distance_matrix)return min_distance# 示例输入坐标nodes1 = [[2.8095238095238,2.9047619047619 ,0],[2.8095238095238,3, 0.28571428571429] ,[2.8095238095238,30, 0.28571428571429]]nodes2 = [[3 ,2.2380952380952 ,1.047619047619],[3, 2.5238095238095, 0.95238095238095]]# 计算最短距离min_distance = calculate_min_distance(nodes1, nodes2)# 输出最短距离:", min_distance)
有一点需要注意,列表之间的格式需要转换一下,tcl列表转换为Python列表代码
set tcl_list {{1 2 3} {2 3} {2 5 8 9}}set python_list_str ""foreach sublist $tcl_list {append python_list_str [format "\[%s\]" [join $sublist ","]]append python_list_str ","}# 去除最后一个逗号set python_list_str [string trimright $python_list_str ","]puts [format "\[%s\]" $python_list_str]
tcl如何调用python,传送门在这里。