Ну, я только начал использовать PDL, но из того, что я видел и использовал, не похоже, что PDL действительно то, что вы хотите для создания последовательностей.Возможно, вам лучше использовать оператор диапазона Perl (..
) с любой комбинацией map
, grep
и x
.
Тем не менее, если вы действительно решили использовать PDL дляпо какой-то причине вы, возможно, могли бы использовать функцию sequence
, а затем вертеть пидл до тех пор, пока она не будет выглядеть так, как вы хотите:
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]
(Выше было бы короче, если бы я зналкак проще дублировать матрицы) [править] Кажется, это легко сделать с помощью пустышки!$a = (zeroes(2,3)->yvals + 1)->dummy(2,3)->flat
Еще раз, если у вас нет особой необходимости делать это, я думаю, что было бы лучше использовать perl для создания ваших последовательностей.
[править] Вот как вы это сделаетечто: Обратите внимание, что 'x
' не просто строковый множитель, он также умножает списки.Вам нужно явно использовать скобки вокруг ваших переменных, чтобы сообщить Perl, что x
используется в списке.
#> 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])