2017-04-24 2 views
2

거리를 계산하려면이 코드를 썼습니다. 그러나 ValueError: math domain error의 오류가 발생했습니다. 반복을에서다차원 행렬의 거리 계산

import math 

a=[[5, 10], 
    [16, 23]] 

b=[[6, 1], [21, 2]] 

dL=[] 
dist=[] 
k=0 
h=1 
for i in range(len(a)): 
    dL=[] 
    for j in range(len(a)): 
     d=math.sqrt((a[i][k]-b[j][k])^2 + (a[i][h]-b[j][h])^2) 
     dL.append(d) 
    dist.append(dL) 

, d은 다음과 같아야합니다

i=0, j=0: d=sqrt((5-6)^2+(10-1)^2) 
i=0, j=1: d=sqrt((5-21)^2+(10-2)^2) 
i=1, j=0: d=sqrt((16-6)^2+(23-1)^2) 
i=1, j=1: d=sqrt((16-21)^2+(23-2)^2) 
+3

'^2'은 사각형이 아닙니다. – ForceBru

+3

'x ** y'를 사용하여'x'를'y' 번째 힘으로 올립니다. – blacksite

+0

d를 계산할 때 같은 줄에 d를 4 자리로 반올림하는 방법 – user02

답변

0

len(a)의 값이 2, 0부터 카운트 때문에, 배열의 3 요소에 대해 질문, 당신은
을 수행해야합니다 for i in range(len(a) - 1):

+0

'range (len (a))'는'0'에서'len (a) -1'까지 값을 생성하기 때문에 잘못된 것입니다. – martineau

0

sqrt는 음수와 함께 사용하려고하면 오류가 발생합니다. 결과가 복소수이므로 sqrt (-16)는 오류를 제공합니다. 그것은 (많은) 다른 프로그래밍 언어에서와 같이

from math import sqrt 
a=[[5, 10], [16, 23]] 


b=[[6, 1], [21, 2]] 

dL=[] 
dist=[] 
k=0 
h=1 
for i in range(len(a)): 
    dL=[] 
    for j in range(len(a)): 
     temp1 = (a[i][k]-b[j][k]) ** 2 
     temp2 = (a[i][h]-b[j][h]) ** 2 
     temp = temp1 + temp2 
     if temp > 0: 
      d = sqrt(temp) 

     dL.append(d) 
    dist.append(dL) 
+0

당신의 대답으로는 해결할 수없는이 문제는 OP의 '**'대신에 '^'를 사용하는 것에 있습니다. 이는 이미 주석에서 설명하고 있습니다. –

+0

그래, 나는 동의하지만, sqrt를 복소수로 반환 할 경우 sqrt를 사용하면 또 다른 문제가 발생한다. @ThierryLathuille – user229204

+0

사각형이 양수이다. –

0

은 코멘트에서 언급 @not_a_robot으로, 파이썬에서 지수 연산자는 **하지 ^입니다. 간단하게 교체하여 문제를 해결할 수 있습니다. 내가 코멘트에서 언급 한 바와 같이

import math 

a= [[ 5, 10], 
    [16, 23]] 
b= [[ 6, 1], 
    [21, 2]] 

dL=[] 
dist=[] 
k=0 
h=1 
for i in range(len(a)): 
    dL=[] 
    for j in range(len(a)): 
     d = math.sqrt((a[i][k]-b[j][k])**2 + (a[i][h]-b[j][h])**2) 
     dL.append(d) 
    dist.append(dL) 

, 더 빨리 당신에게 동일한 결과를 제공하고 읽기 쉽게하므로 이것에 대한 math.hypot()을 사용 (쓰기) 더 나은 것 :

for i in range(len(a)): 
    dL=[] 
    for j in range(len(a)): 
     d = math.hypot(a[i][k]-b[j][k], a[i][h]-b[j][h]) 
     dL.append(d) 
    dist.append(dL)