我想做类似这样的事情,在现有PDL的每个元素 in-place 上调用myfunc():
$pdl = pdl [1,2,3]; $pdl = pdl [ map { myfunc($_) } @{ unpdl($pdl) } ];
我已经搜索了文档,但还没有任何结果:是否有一种方法可以访问PDL的每个元素,并在元素上运行一些东西?
wh6knrhe1#
您可以使用broadcast_define(旧版本中为thread_define)执行以下操作:
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)做就地修改。
$pdl**2
unpdl
map
pdl
(a();[o]b())
my $out = square($pdl)
square($pdl, $pdl)
1条答案
按热度按时间wh6knrhe1#
您可以使用
broadcast_define
(旧版本中为thread_define
)执行以下操作:这比使用原生操作(
$pdl**2
在这种情况下得到相同的结果,通过组合原生操作可以实现更复杂的操作)或PDL::PP(使用C编写函数)要慢,但比unpdl
/map
/pdl
要快。您必须查看PDL::PP文档以了解
(a();[o]b())
等签名的解释,但这是一个简单的情况:该函数具有标量输入和标量输出,并且可以被广播到任意数量的维度。当输出参数被省略时,我似乎不能让
broadcast_define
d函数返回一个值(例如my $out = square($pdl)
),但是你可以用square($pdl, $pdl)
做就地修改。