인접한 두 좌표 사이의 거리를 계산하는 방법은 무엇입니까?

인접한 두 좌표 사이의 거리를 계산하는 방법은 무엇입니까?

3개의 열과 임의 개수의 행(행)이 있는 파일이 있다고 가정해 보겠습니다. 각 행은 xyz 좌표에 해당합니다.

1  2  3 
4  5  6
7  8  9
10 11 12
...

첫 번째와 두 번째 좌표, 두 번째와 세 번째 좌표, 세 번째와 네 번째 좌표 등 사이의 거리를 어떻게 계산하나요?

이것이 제가하는 것입니다. 하지만 내 생각엔 더 간단할 수도 있다.

a=`wc -l < oldfile`
for i in $(seq 2 $a); do
   j=$((i-1))
   sed -n "${j},${i} p" <oldfile
done > ala

split ala -l 2 ala.
for i in ala.??; do
   echo `cat $i`| awk '{printf  "%.10f \n", sqrt (($4-$1)^2 + ($5-$2)^2) + ($6-$3)^2}'
done > newfile

어떤 답변이라도 환영합니다. 저는 Linux 프로그래밍을 처음 접했기 때문에 및/또는을 사용하는 간단한 명령을 사용하면 매우 감사 split하겠습니다 :).catechoawk

감사해요.

답변1

다음 awk명령은 이름이 지정된 파일의 한 줄에서 공백으로 구분된 (x,y,z) 좌표를 읽고 file각 줄 사이의 거리를 계산합니다.

awk '
NR > 1 { printf "%f\n", sqrt(($1-x)^2 + ($2-y)^2 + ($3-z)^2) }
       { x=$1; y=$2; z=$3 }' file

위 명령은 awk첫 번째 줄을 제외한 모든 줄에 대해 현재 줄에 주어진 지점에서 이전 줄에 주어진 지점까지의 거리를 기록합니다. 변수 x, y및 에는 z거리 값을 계산하고 출력한 후 업데이트된 이전 행의 좌표가 포함됩니다.

입력 있음

7 4 3
17 6 2
-2 0 0

...결과는

10.246951
20.024984

답변2

사용행복하다(이전 Perl_6)

처음 6개 값(행당 3개)을 얻기 위해 문제를 단순화합니다.

raku -e 'my @a = words; for @a -> $x1,$y1,$z1,$x2,$y2,$z2 {  \
         say sqrt( ($x1 - $x2)**2 + ($y1 - $y2)**2 + ($z1 - $z2)**2) };'  

#OR

raku -e 'my @a = words; for @a -> \x1,\y1,\z1,\x2,\y2,\z2 {  \
         say sqrt( (x1 - x2)**2 + (y1 - y2)**2 + (z1 - z2)**2 ) };'  

Raku는 일부 프로그래머가 더 읽기 쉬운 부호 없는 변수(두 번째 예)를 허용합니다. 파일은 @a공백으로 구분된 배열 로 읽혀집니다 words. 6개의 변수가 선언되었습니다(두 번째 예): x1,y1,z1x2,y2,z2. 거리 방정식은 OP가 요청한 대로 수행되고 값을 반환합니다.

[부호 없는 변수는 앞에 백슬래시를 사용하여 선언되지만 그 시점부터는 백슬래시 없이 작성할 수 있습니다. 부호 없는 변수는 일반적으로 불변입니다(상수 선언에 유용합니다. 자세한 내용은 아래 URL을 참조하세요).

입력 예(간략화된 버전):

1  2  3
4  5  6
7  8  9
10  11  12
13  14  15
16  17  18

출력 예(간단화된 버전):

5.196152422706632
5.196152422706632
5.196152422706632

@a최종 버전의 경우 다음과 같이 데이터를 배열로 읽을 때 중첩을 생성하도록 Raku에 지시하기만 하면 됩니다 my @a=lines.rotor(2 => -1).words;. @Kusalananda가 제공한 샘플 데이터를 사용합니다.

~$ cat file
7 4 3
17 6 2
-2 0 0

~$ raku -e 'my @a=lines.rotor(2 => -1).words; for @a -> \x1,\y1,\z1,\x2,\y2,\z2 {say sqrt((x1 - x2)**2 + (y1 - y2)**2 + (z1 - z2)**2)};'  file
10.246950765959598
20.024984394500787

https://docs.raku.org/언어/variables#index-entry-\_(sigilless_variables)
https://docs.raku.org/routine/rotor
https://raku.org

답변3

"제거"는 "별도로 제거" 또는 "삭제"라는 정확히 무엇을 의미합니까? 일반적으로 저는 후자를 생각하겠지만 PS에서는 전자를 가리키는 것 같나요?

전자를 가정하면 셸에서 다음을 수행할 수 있습니다.

# index of first row to print
n=3
tail -n +${n} <filename> | head -n 2

주어진 n=3에 대해 이것은 세 번째와 네 번째 줄을 인쇄합니다.

답변4

무슨 뜻인지 잘 모르겠지만 이 솔루션을 사용하여 각 행의 6D 거리를 계산합니다.

awk 파일 dist.awk

function memorize() 
{ for(i=1;i<=6;i++) previous[i]=$i ;}

NR>1 {
   s=0 ;
   for(i=1;i<=6;i++) s+=($i-previous[i])**2 ;
   printf "dist=%f\n",sqrt(s) ;
}
{ 
  memorize() ;
  print ; 
}
  • 1많은 사람들이 선호하는print

이상하게도 귀하의 데이터를 바탕으로 다음과 같은 결과를 얻었습니다.

awk -f dist.awk  original.data
1  2  3  4  5  6
dist=14.696938
7  8  9  10 11 12
dist=14.696938
13 14 15 16 17 18
dist=14.696938
19 20 21 22 23 24

(점은 6차원 공간에 정렬되어 있으며 거리는 sqrt(36*6) 단위입니다)

요점은 awk가 이전 줄을 기억하고 계산을 수행할 수 있다는 것입니다.

관련 정보