Kronecker product: Difference between revisions

Content added Content deleted
(→‎{{header|Perl}}: avoid loops in PDL)
Line 2,893: Line 2,893:
use warnings;
use warnings;
use PDL;
use PDL;
use PDL::NiceSlice;


sub kron{
sub kron {
my $A = shift;
my ($x, $y) = @_;

my $B = shift;
return $x->dummy(0)
my ($r0, $c0) = $A->dims;
->dummy(0)
my ($r1, $c1) = $B->dims;
->mult($y, 0)
my $kron = zeroes($r0 * $r1, $c0 * $c1);
->clump(0, 2)
for(my $i = 0; $i < $r0; ++$i){
->clump(1, 2)
for(my $j = 0; $j < $c0; ++$j){
$kron(
($i * $r1) : (($i + 1) * $r1 - 1),
($j * $c1) : (($j + 1) * $c1 - 1)
) .= $A($i,$j) * $B;
}
}
return $kron;
}
}


my @mats = (
my @mats = (
[pdl([[1,2], [3,4]]), pdl([[0,5], [6,7]])],
[pdl([[1, 2], [3, 4]]),
[pdl([[0,1,0], [1,1,1], [0,1,0]]), pdl([[1,1,1,1], [1,0,0,1], [1,1,1,1]])],
pdl([[0, 5], [6, 7]])],
[pdl([[0, 1, 0], [1, 1, 1], [0, 1, 0]]),
pdl([[1, 1, 1, 1], [1, 0, 0, 1], [1, 1, 1, 1]])],
);
);
for my $mat(@mats){
for my $mat (@mats) {
print "A = $mat->[0]\n";
print "A = $mat->[0]\n";
print "B = $mat->[1]\n";
print "B = $mat->[1]\n";