tcl调用Python实现两组节点最近距离计算
记录一下,hypermesh二次开发项目中实际遇到的问题,寻找两组节点之间的最近距离。之前都是使用Tcl的循环加循环方式来计算最近距离。数据量小感受不出慢。但用上这个项目的数据,两组节点分别10000个,程序运行的时间复杂度为O(n^2),需要循环100,000,000次。大力出奇迹版本#定义两组3D节点的坐标setnodes1{{123}{456}{789}}setnodes2{{101112}{131415}{161718}}#计算两组节点之间的最短距离setminDistance1e9;#初始值设为一个较大的数#遍历两组节点的所有组合,计算距离foreachnode1$nodes1{foreachnode2$nodes2{setdx[expr[lindex$node20]-[lindex$node10]]setdy[expr[lindex$node21]-[lindex$node11]]setdz[expr[lindex$node22]-[lindex$node12]]setdistance[expr{sqrt($dx*$dx+$dy*$dy+$dz*$dz)}]if{$distance<$minDistance}{setminDistance$distance}}}#输出最短距离puts"最短距离为:$minDistance"后面听着电脑风扇呜呜呜的响起,于是,转用Python来重新实现这个任务。同样的数据量不到一秒就计算出来了。python的矩阵运算版本importnumpyasnpdefcalculate_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)returnmin_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)#输出最短距离print("最短距离为:",min_distance)有一点需要注意,列表之间的格式需要转换一下,tcl列表转换为Python列表代码settcl_list{{123}{23}{2589}}setpython_list_str""foreachsublist$tcl_list{appendpython_list_str[format"\[%s\]"[join$sublist","]]appendpython_list_str","}#去除最后一个逗号setpython_list_str[stringtrimright$python_list_str","]puts[format"\[%s\]"$python_list_str]tcl如何调用python,传送门在这里。来源:TodayCAEer