是否有一个map()等价的PDL没有做PDL (map {} unpdl)?



我想做这样的事情来调用myfunc()对每个元素就地在现有的PDL:

$pdl = pdl [1,2,3];
$pdl = pdl [ map { myfunc($_) } @{ unpdl($pdl) } ];

我已经搜索了文档,但还没有找到:

是否有一种方法可以访问PDL的每个元素并在元素上运行一些东西?

您可以使用broadcast_define(旧版本中的thread_define):

use PDL;
broadcast_define('square(a();[o]b())', over { $_[1] .= $_[0] ** 2 });
my $pdl = pdl [[1,2,3], [4,5,6]];
square($pdl, (my $out = null));
print($out); # $out is pdl [[1,4,9], [16,25,36]]

这比使用本机操作($pdl**2在这种情况下得到相同的结果,并且通过组合本机操作可以实现许多更复杂的事情)或PDL::PP慢,其中您用C编写函数,但它比unpdl/map/pdl快。

您必须查看PDL::PP文档以了解签名的解释,如(a();[o]b()),但这是一个简单的情况:该函数具有标量输入和标量输出,并且可以广播到任意数量的维度。

当输出参数被省略(例如my $out = square($pdl))时,我似乎无法让broadcast_defined函数返回值,但您可以使用square($pdl, $pdl)进行就地修改。

最新更新