嗯,我刚开始使用PDL,但从我所见和使用的情况来看,它似乎并不是你想要用来制作序列的最佳选择。你最好使用Perl的范围运算符(..
)与任何组合的map
、grep
和x
。
话虽如此,如果你确实有某种原因坚持要使用PDL,你可能可以使用sequence
函数,然后调整piddle,直到它看起来像你想要的东西:
pdl> p sequence(10)
[0 1 2 3 4 5 6 7 8 9]
pdl> p sequence(2,4) #Slice column 1 for evens, 2 for odds.
[
[0 1]
[2 3]
[4 5]
[6 7]
]
pdl> p sequence(3,4) * 5 #Multiply to step by an amount.
[
[ 0 5 10]
[15 20 25]
[30 35 40]
[45 50 55]
]
您还可以使用切片来抓取列以沿着序列进行步进。
对于其他任何内容,例如您在R示例中所做的事情,您需要开始变得有创意:
pdl> p $a = (yvals zeroes(2,3))+1
[
[1 1]
[2 2]
[3 3]
]
pdl> p pdl($a,$a,$a)->flat
[1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3]
如果我知道如何更轻松地复制矩阵,则上述内容将更短
[编辑] 看起来使用dummy就可以轻松完成!
$a = (zeroes(2,3)->yvals + 1)->dummy(2,3)->flat
再次强调,除非您有特定需要,否则最好使用perl来生成序列。
[编辑] 下面是如何做到这一点:
请注意,'x'不仅是字符串乘法器,它还可以乘以列表。您需要明确地在变量周围使用括号,以通知perl正在对列表使用'x'。
my @s = map {($_) x 2} (1..3) x 3;
my @s = map {$_ * 3} 0..12/3;
use List::MoreUtils qw(pairwise);
my @s = &pairwise(sub {($a) x $b}, [1..4], [1,2,3,2])