Well, I only just started using PDL but from what I've seen and used, it doesn't seem like PDL is really what you want for making sequences. You're probably better off using perl's range operator (..
) with any combination of map
, grep
, and x
.
That said, if you were really determined to use PDL for some reason, you could probably use the sequence
function and then twiddle the piddle until it looks like what you want:
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]
]
You could also use slices to grab columns as a way to step along a sequence.
For anything else, such as what you're doing in your R examples, you'd need to start getting creative:
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]
(The above would be shorter if I knew how to more easily duplicate matrixes)
[edit] It seems that's easily done with dummy!
$a = (zeroes(2,3)->yvals + 1)->dummy(2,3)->flat
Once again, unless you have a specific need to do this I think it would be best to use perl for making your sequences.
[edit]Here's how you'd do that:
Note that 'x
' is not just a string multiplier, it also multiplies lists. You need to explicitly use brackets around your vars to inform perl that x
is being used on a list.
#> 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])