我在下面的代码中尝试使用Perl的PDL:
#!/usr/bin/perl -w
use strict;
use PDL::Core qw(pdl);
use PDL::Math qw(isfinite);
use PDL::Primitive qw(statsover);
my $div = 4;
my @array1 = (0..10);
my $pdl_array = log(pdl(@array1)/$div);
$pdl_array->where(!isfinite($pdl_array)) .= 0;
my($mean,$stdev) = statsover($pdl_array);
die $pdl_array,"\n",$mean," ",$stdev,"\n";我得到了这个错误:
未定义的子例程&PDL::divide在./compare_const.pl第10行调用。
有什么提示吗?非常感谢。
发布于 2014-07-03 20:40:34
PDL在设计上是不同寻常的,因此有一个不同寻常且有些脆弱的导入机制。每个PDL模块都通过inserting a new method directly into PDL's package为PDL添加了功能。这一决定是在PDL v2设计的非常早的时候做出的,并且在其间的十年中没有改变。(没有理由不能更改它,即使是以向后兼容的方式,但没有一个PDL开发人员留出时间这样做。)
因此,您必须加载一些模块,以确保PDL具有其必需的基本功能。如果查看一下PDL导入函数,就会注意到it explicitly loads a number of packages into the caller's namespace。这样做的原因是好的-将功能拆分到多个模块,以保持分发的合理性-但实现并不符合常见的Perl实践。这就是您尝试将特定函数导入命名空间失败的原因。
解决方案已经解释过了。或者用一个use PDL替换所有的use PDL::...语句
use strict;
use warnings;
use PDL;
my $div = 4;
...或者使用use PDL::Lite (以确保PDL包是完整的),然后将特定函数导入(主)包
use strict;
use warnings;
use PDL::Lite;
use PDL::Core qw(pdl);
use PDL::Math qw(isfinite);
use PDL::Primitive qw(statsover);
my $div = 4;
...发布于 2014-07-01 00:56:29
PDL有一个必须加载的东西的最小集合。要正确加载所有这些内容,您必须使用use PDL (它还会导出大量内容)或use PDL::Lite。
(出于某种原因,我认为您显式地直接调用了PDL::divide并得到了该错误,因此我的原始答案如下。)
原始答案:
我想知道为什么你认为这应该行得通?
是的,PDL导出了一堆东西(如果你使用它,但你不使用它),但这不能保证它从哪里导出它。(实际上,它似乎是从许多不同的地方直接导出到正在使用的包中。)
如果您试图避免名称空间污染,我建议您要么导入到指定的包中,然后使用其中的内容:
{
package My::PDL;
use PDL;
}
...
My::PDL::divide...或者使用OO接口(我想,请参阅PDL::Lite?)
发布于 2014-07-01 04:52:43
只需添加use PDL;,您的代码就会正常工作:
#!/usr/bin/perl -w
use strict;
use PDL;
use PDL::Core qw(pdl);
use PDL::Math qw(isfinite);
use PDL::Primitive qw(statsover);
my $div = 4;
my @array1 = (0..10);
my $pdl_array = log( pdl(@array1) / $div );
$pdl_array->where(!isfinite($pdl_array)) .= 0;
my ($mean, $stdev) = statsover($pdl_array);
die $pdl_array, "\n", $mean, " ", $stdev, "\n";输出:
[0 -1.3862944 -0.69314718 -0.28768207 0 0.22314355 0.40546511 0.55961579 0.69314718 0.81093022 0.91629073]
0.112860814716055 0.696414187766251https://stackoverflow.com/questions/24494845
复制相似问题