2015-06-22 119 views
1

我有一個包含2列的矩陣,它對應於軌跡中點的座標(x,y)。我想用歐氏距離來計算軌跡的總長度。軌跡的總長度

首先我打開我的軌跡文件

fichier="fichier_position_2_test.txt" 
file = open(fichier, "rb") 
for ligne in file: 
    ligne = ligne.split(' ') 
    m.append(array([(ligne[1]),(ligne[2])])) 

然後我計算矩陣

def T(mat): 
    n=len(mat) 
    M=[0 for x in range(mat)] 
    for j in range(0,n-1): 
     val = sqrt((mat[j+1][0]-mat[j][0])*(mat[j+1][0]-mat[j][0]) + (mat[j+1][1]-mat[j][1])*(mat[j+1][1]-mat[j][1])) 
     M.append(val) 
     L = sum(M) 
    return L 

兩個點之間的歐氏距離但是它不工作這麼好

這裏我的檔案 http://s000.tinyupload.com/?file_id=26745790747175243934

下面是一些測試

#TEST 
A = array([(-4e-9,7.2e-6),(-5.7e-4,3.7e-4),(-8.7e-3,5.7e-3),(-1.2e-3,7.1e-4)]) 
print T(A) 
print T(m) 

而結果

0.0194054064971 
Traceback (most recent call last): 
File "tortuosity.py", line 46, in <module> 
print T(m) 
File "tortuosity.py", line 37, in T 
val = sqrt((mat[j+1][0]-mat[j][0])*(mat[j+1][0]-mat[j][0]) + (mat[j+1][1]-mat[j][1])*(mat[j+1][1]-mat[j][1])) 
TypeError: unsupported operand type(s) for -: 'numpy.string_' and 'numpy.string_' 

我認爲問題來自矩陣m。因爲,看到用矩陣A(示例)它給出了預期的結果(0.0194054064971)

回答

1

問題似乎是你永遠不會將字符串從文件轉換爲浮點數。因此,你的數組包含了很多字符串(看起來像數字,但仍然是字符串),並且你不能拿出字符串的區別。

最低,使你的代碼的工作就是要改變這一行:

m.append(array([float(ligne[1]), float(ligne[2])])) 

但要注意,有一些其他小問題:

  • 你與初始化您的距離的列表0,但是你附加到那些現有的零,而不是覆蓋它們
  • 事實上,你根本不需要那個列表,直接計算總和
  • 你可以讓你的代碼更簡單使用電源操作**,而不是重複相同的表達兩次
  • 可以使用zip(list, list[1:])迭代的連續行對
  • 使用元組拆包而非索引,使代碼更易讀
  • 使用with打開文件,並且不使用file作爲變量名,因爲它的陰影類型

所有的一切,你可以使你的代碼相當多的緊湊:

def T(mat): 
    return sum(sqrt((y2-y1)**2 + (x2-x1)**2) for (x1, y1), (x2, y2) in zip(mat, mat[1:])) 

with open("fichier_position_2_test.txt") as f: 
    m = np.array([(float(items[1]), float(items[2])) for items in (line.split() for line in f)]) 
    print T(m) 

結果爲m0.00132038721131,併爲A0.0194054064971,符合市場預期。