好吧,我才刚刚开始使用 PDL,但从我所见和使用的情况来看,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 #-> rep(1:3, each=2, times=3)
[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
' 不只是一个字符串乘法器,它还乘以列表。您需要在变量周围显式使用方括号来通知 perlx
正在列表中使用。
#> rep(1:3, each=2, times=3)
my @s = map {($_) x 2} (1..3) x 3;
#> seq(0,12,3)
my @s = map {$_ * 3} 0..12/3;
#> rep(1:4, c(1,2,3,2))
#Ewww. So you basically want to multiply one list by another list.
#Here's one way to do it:
use List::MoreUtils qw(pairwise);
my @s = &pairwise(sub {($a) x $b}, [1..4], [1,2,3,2])