我想这样做,以便对现有PDL上的每个元素调用myfunc()。
$pdl = pdl [1,2,3];
$pdl = pdl [ map { myfunc($_) } @{ unpdl($pdl) } ];我已经搜索过这些文档,但还没有:
是否有方法访问PDL的每个元素并在元素上运行某些内容?
发布于 2022-06-12 05:24:14
为此,可以使用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]]这比使用本机操作要慢(在本例中,unpdl/map/pdl.得到的结果是相同的,通过编写本机操作可以实现许多更复杂的事情),或者PDL::PP,在PDL::PP中用C编写函数,但速度比$pdl**2快。
您必须查看PDL::PP文档,以获得类似于(a();[o]b())的签名说明,但这是一个简单的情况:函数有标量输入和标量输出,并且可以广播到任意数量的维度。
当省略输出参数时,我似乎无法让broadcast_defined函数返回一个值(例如my $out = square($pdl)),但是您可以使用square($pdl, $pdl)进行就地修改。
https://stackoverflow.com/questions/72589417
复制相似问题