perl 有没有一个map()等价于PDL而不执行pdl(map {} unpdl)?

oprakyz7  于 2022-11-15  发布在  Perl
关注(0)|答案(1)|浏览(85)

我想做类似这样的事情,在现有PDL的每个元素 in-place 上调用myfunc():

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

我已经搜索了文档,但还没有任何结果:
是否有一种方法可以访问PDL的每个元素,并在元素上运行一些东西?

wh6knrhe

wh6knrhe1#

您可以使用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())等签名的解释,但这是一个简单的情况:该函数具有标量输入和标量输出,并且可以被广播到任意数量的维度。
当输出参数被省略时,我似乎不能让broadcast_define d函数返回一个值(例如my $out = square($pdl)),但是你可以用square($pdl, $pdl)做就地修改。

相关问题