【问题标题】:Is there a faster way to compute the sum of squared distances of two point matrices?有没有更快的方法来计算两点矩阵的平方距离之和?
【发布时间】:2021-08-30 14:48:08
【问题描述】:

我正在尝试使以下代码运行得更快。 该代码试图通过计算两帧的距离平方和来找到两个对象的最近帧,每帧有 137 个点 (x,y)。 填充距离矩阵后,我正在寻找矩阵中的最小距离并返回此条目的正确性。

enter code here
def getSquraredDistancesSum(frame1, frame2):
  sum = 0
  distance = 0
  for i in range(0, 137):
      x1 = frame1[i][0]
      y1 = frame1[i][1]
      x2 = frame2[i][0]
      y2 = frame2[i][1]
      sum += math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
  return sum

def get_closest_frames(dataobj1, dataobj2, endpoint, startpoint):
    nf1 = len(dataobj1.body.data)
    nf2 = len(dataobj2.body.data)
    window1size= int(0.15*nf1) 
    window2size = int(0.15*nf2)  
    distancematrix = np.zeros(shape=(window1size, window2size))
    for i in range(endpoint - window1size, endpoint):
      for j in range(startpoint, startpoint + window2size):
        d = getSquraredDistancesSum(dataobj1.body.data[i][0], 
             dataobj2.body.data[j][0])
        distancematrix[i - (endpoint - window1size)][j - startpoint] = d
    min = 1000000
    newstartpoint = startpoint
    newendpoint = endpoint
    for i in range(0, window1size):
      for j in range(0, window2size):
        if distancematrix[i][j] <= min:
            min = distancematrix[i][j]
            newstartpoint = j + startpoint
            newendpoint = i + (endpoint - window1size)
    return newstartpoint, newendpoint

【问题讨论】:

    标签: python numpy matrix optimization difference


    【解决方案1】:

    我无法准确理解问题试图达到的目标。要获取两组点的所有组合之间的差异,这可能会有所帮助。通过将 x 和 y 坐标转换为复数,numpy 可以将您的帧处理为 2 个 1D 数组。减法生成所有 f1 - f2 差异。

    如果这没有帮助,请尝试显示组测试数据和预期的测试结果。

    import numpy as np 
    
    # Create some test data
    np.random.seed( 1234 )
    frame1 = np.array( [ np.random.rand( ) * 100 + 50,
                         np.random.rand( ) * 100 + 50 ] )
    
    frame2 = np.array( [ np.random.rand( ) * 100 + 50,
                         np.random.rand( ) * 100 + 50 ] )
    frame1                                                                                            
    # array([[ 69.15194504, 112.2108771 ,  93.7727739 ],
    #        [128.53585837, 127.99758081,  77.25926053]])
    
    frame2                                                                                            
    # array([[ 77.64642551, 130.18721775, 145.81393537],
    #        [137.59326347,  85.781727  , 100.09951255]])
    
    
    f1 = frame1[ 0 ] + frame1[ 1 ] * 1j  # Make each x & y coord a complex number
    f2 = frame2[ 0 ] + frame2[ 1 ] * 1j  # Make each x & y coord a complex number 
    f1                                                                                                
    # array([ 69.15194504+128.53585837j, 112.2108771 +127.99758081j,
    # 93.7727739  +77.25926053j])
    f2                                                                                                
    # array([ 77.64642551+137.59326347j, 130.18721775 +85.781727j  ,
    # 145.81393537+100.09951255j])
    
    differences = f1 - f2[:, None]  # complex differences, 2 dimensions 3 x 3
    differences 
    
    # array([[ -8.49448048 -9.0574051j ,  34.56445159 -9.59568266j,
    #          16.12634839-60.33400295j],
    #        [-61.03527272+42.75413138j, -17.97634065+42.21585382j,
    #         -36.41444385 -8.52246647j],
    #        [-76.66199033+28.43634582j, -33.60305826+27.89806826j,
    #         -52.04116147-22.84025202j]])
    
    distances = np.abs( differences )
    
    print( distances, '\n' )                                                                                    
    # [[12.41743878 35.87169413 62.45198975]
    #  [74.519932   45.88384396 37.39845125]
    #  [81.76604751 43.67456625 56.83273352]] 
    
    print( distances.sum( axis = 0 ), '\n', distances.sum( axis = 1 ) )
    #  [168.70341828 125.43010434 156.68317452] # Sum down columns 
    #  [110.74112265 157.80222721 182.27334728] # Sum across rows
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-27
      相关资源
      最近更新 更多