Мне нужно найти следующего соседа, используя алгоритм euklid-distance-distance.
Даны два хэша с каждыми 100 элементами в этом формате:
$hash{$i}{price}
$hash{$i}{height}
Мне нужно сравнить каждыйхэш-элементы друг с другом, так что мой результат в матрице 100 х 100.
После этого моя матрица должна быть отсортирована по следующим правилам:
$hash{$i,$j} {lowest_euklid_distance}
$hash{$i,$j+1}{lowest_euklid_distance + 1}
$hash{$i,$j+2}{lowest_euklid_distance + 2}
.
.
$hash{$i+1,$j}{lowest_euklid_distance}
$hash{$i+1,$j}{lowest_euklid_distance + 2}
.
.
$hash{$i+n,$j+n}{lowest_euklid_distance+n}
Моя проблема - правильно отсортировать эти элементы.
Любые советы?
Заранее спасибо.
/ edit: добавление дополнительной информации:
Я создаю расстояние с помощью следующей подпрограммы:
sub euklid_distance{
#w1 = price_testdata
#w2 = height_testdata
#h1 = price_origindata
#h2 = height_origindata
my $w1 = trim($_[0]);
my $w2 = trim($_[1]);
my $h1 = trim($_[2]);
my $h2 = trim($_[3]);
my $result = (((($w2-$w1)**2)+(($h2-$h1)**2))**(1/2));
return $result;
}
Я получаю тест и исходные данные из двух отдельных списков.
Результат с матрицей 100x100 создается с помощью следующего кода:
my %distancehash;
my $countvar=0;
for (my $j=0;$j<100;$j++){
for (my $i=0;$i<100;$i++){
$distancehash{$countvar}{distance} = euklid_distance( $origindata{$i}{price}, $testdata{$j}{price}, $origindata{$i}{height}, $testdata{$j}{height} );
$distancehash{$countvar}{originPrice} = $origindata{$i}{price};
$distancehash{$countvar}{originHeight} = $origindata{$i}{height};
$distancehash{$countvar}{testPrice} = $testdata{$j}{price};
$distancehash{$countvar}{testHeight} = $testdata{$j}{height};
$countvar++;
}
}
, где $ j переходит над тестовыми даннымии $ i за исходные данные.
Моя цель - создать новый хеш, отсортированный по наименьшему расстоянию от текущего $ j по возрастанию до самого высокого.