我有一个 AoA 的哈希值:
$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 和有 PDL 的简单脚本:
没有 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);
带 PDL
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);