如何在 PDL 中执行笛卡尔积
How to perform cartesian product in PDL
我想采用任意一维向量 a = [k] 和 b = [m] 并形成有序矩阵对 c = [2 x k x m] 这样 $c->(:,(i),(j)) = [ $a->(i), $b->(j) ]
。 IE。 a 和 b a.k.a 笛卡尔积中所有有序元素对的集合。
当然我可以使用循环和[glue]函数来完成这个,但这不符合Perl/PDL的精神。是否有一种涉及切片、虚拟尺寸和胶水的奇特方法可以让我到达那里?
此外,使用 Math::Cartesian::Product(如此处回答:In Perl, how can I get the Cartesian product of multiple sets? 是作弊!:3 我想要直接 perl/PDL 并希望在此过程中学到一些东西。
我找到了符合我标准的东西:
my $a = pdl 1,2,3,4;
my $b = pdl 5,6,7;
print "a = $a\n";
print "b = $b\n";
print "dummy dimensioned:\n";
$a = $a->dummy(0,$b->dim(0));
print "a".$a->shape." = $a\n";
$b = $b->dummy(0, $a->dim(1))->transpose;
print "b".$b->shape." = $b\n";
print "Glued together:\n"
my $c = $a->dummy(0,1)->glue(0, $b->dummy(0,1));
print "c".$c->shape." = $c\n";
a = [1 2 3 4]
b = [5 6 7]
dummy dimensioned:
a[3 4] =
[
[1 1 1]
[2 2 2]
[3 3 3]
[4 4 4]
]
b[3 4] =
[
[5 6 7]
[5 6 7]
[5 6 7]
[5 6 7]
]
Glued together:
c[2 3 4] = [[[1 5][1 6][1 7]][[2 5][2 6][2 7]][[3 5][3 6][3 7]][[4 5][4 6][4 7]]]
我想采用任意一维向量 a = [k] 和 b = [m] 并形成有序矩阵对 c = [2 x k x m] 这样 $c->(:,(i),(j)) = [ $a->(i), $b->(j) ]
。 IE。 a 和 b a.k.a 笛卡尔积中所有有序元素对的集合。
当然我可以使用循环和[glue]函数来完成这个,但这不符合Perl/PDL的精神。是否有一种涉及切片、虚拟尺寸和胶水的奇特方法可以让我到达那里?
此外,使用 Math::Cartesian::Product(如此处回答:In Perl, how can I get the Cartesian product of multiple sets? 是作弊!:3 我想要直接 perl/PDL 并希望在此过程中学到一些东西。
我找到了符合我标准的东西:
my $a = pdl 1,2,3,4;
my $b = pdl 5,6,7;
print "a = $a\n";
print "b = $b\n";
print "dummy dimensioned:\n";
$a = $a->dummy(0,$b->dim(0));
print "a".$a->shape." = $a\n";
$b = $b->dummy(0, $a->dim(1))->transpose;
print "b".$b->shape." = $b\n";
print "Glued together:\n"
my $c = $a->dummy(0,1)->glue(0, $b->dummy(0,1));
print "c".$c->shape." = $c\n";
a = [1 2 3 4]
b = [5 6 7]
dummy dimensioned:
a[3 4] =
[
[1 1 1]
[2 2 2]
[3 3 3]
[4 4 4]
]
b[3 4] =
[
[5 6 7]
[5 6 7]
[5 6 7]
[5 6 7]
]
Glued together:
c[2 3 4] = [[[1 5][1 6][1 7]][[2 5][2 6][2 7]][[3 5][3 6][3 7]][[4 5][4 6][4 7]]]