代码之家  ›  专栏  ›  技术社区  ›  cms

如何在PDL中执行笛卡尔乘积

  •  1
  • cms  · 技术社区  · 8 年前

    我想取一个任意的1D向量 a=[k] b=[m] 并形成有序对矩阵 因此 $c->(:,(i),(j)) = [ $a->(i), $b->(j) ] . 一、 e.中所有有序元素对的集合 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,希望在这个过程中学到一些东西。

    1 回复  |  直到 8 年前
        1
  •  3
  •   cms    8 年前

    我得到了符合我标准的东西:

    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]]]