Kronecker product: Difference between revisions
Content added Content deleted
Drkameleon (talk | contribs) |
(→{{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 ($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([[1, 2], [3, 4]]), |
||
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"; |