记录一下,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 np
def 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,传送门在这里。