У меня есть хэш AoAs:
$hash{$key} = [
[0.0,1.0,2.0],
10.0,
[1.5,9.5,5.5],
];
что мне нужно хрустеть следующим образом:
$err += (($hash{$key}[0][$_]-$hash{key}[2][$_])*$hash{$key}[1])**2 foreach (0 .. 2);
вычисление квадрата взвешенной разницы между двумя массивами. Поскольку мой хэш большой, я надеялся, что PDL поможет ускорить вычисления, но по какой-то причине этого не происходит. Я все еще новичок в PDL, поэтому, вероятно, что-то напутал. приведенный ниже скрипт с PDL примерно в 10 раз медленнее. Описание: Следующие два сценария являются моей попыткой просто представить, что происходит в моей программе. Я считываю некоторые эталонные значения в хеш, а затем сравниваю наблюдения (вставленные в хеш на лету) с этими значениями несколько раз с некоторым весом. В сценариях я устанавливаю для эталонного массива, веса и массива наблюдений некоторые произвольные фиксированные значения, но это не будет иметь место во время выполнения.
вот два простых скрипта без PDL и с ним:
без ПДЛ
use strict;
use warnings;
use Time::HiRes qw(time);
my $t1 = time;
my %hash;
my $error = 0;
foreach (0 .. 10000){
$hash{$_} = [
[0.000, 1.000, 2.0000],
10.0,
[1.5,9.5,5.5],
];
foreach my $i (0 .. 2){
$error += (($hash{$_}[0][$i]-$hash{$_}[2][$i])*$hash{$_}[1])**2;
}
}
my $t2 = time;
printf ( "total time: %10.4f error: %10.4f\n", $t2-$t1,$error);
с ПДЛ
use strict;
use warnings;
use PDL;
use Time::HiRes qw(time);
my $t1 = time;
my %hash;
my $error = 0;
foreach (0 .. 10000){
$hash{$_}[0] = pdl[0.000, 1.000, 2.0000];
$hash{$_}[1] = pdl[10.0];
$hash{$_}[2] = pdl[1.5,9.5,5.5];
my $e = ($hash{$_}[0]-$hash{$_}[2])*$hash{$_}[1];
$error += inner($e,$e);
}
my $t2 = time;
printf ( "total time: %10.4f error: %10.4f\n", $t2-$t1, $error);