use PDL; use PDL::ImageND; use PDL::NiceSlice; kill INT,$$ if $ENV{UNDER_DEBUGGER}; # Useful for debugging. sub ok { my $no = shift ; my $result = shift ; print "not " unless $result ; print "ok $no\n" ; } print "1..7\n"; # Right answer my $ans = pdl( [ 3, 9, 15, 21, 27, 33, 39, 45, 51, 27], [ 3, 9, 15, 21, 27, 33, 39, 45, 51, 27], [ 3, 9, 15, 21, 27, 33, 39, 45, 51, 27] ); my $a = xvals zeroes 10,3; my $b = pdl [1,2],[2,1]; my $c=convolve ($a, $b); ok( 1, int(at(sum($c-$ans)))==0 ); $a = zeroes(6,6); $a->(4,:) .= $a(5,:) .= $a(1,2) .= $a(0,4) .= $a(2,0) .= 1; $b = pdl( [-1,0],[0,1] ); my $ans_e = pdl( [ 0, 0, 1, -1, 0, 0], [-1, 0, 0, -1, 0, 0], [ 0, 1, 0, -1, 0, 0], [ 0, 0, 0, -1, 0, 0], [ 1, 0, 0, -1, 0, 0], [ 0, 0, 0, -1, 0, 0] ); $c = convolveND($a,$b,{m=>'d',b=>'e'}); ok( 2, all( abs($c - $ans_e) < 1e-15 ) ); $c = convolveND($a,$b,{m=>'f',b=>'e'}); ok( 3, all( abs($c - $ans_e) < 1e-15 ) ); $ans_p = pdl( [ 0, 0, 1, -1, 0, 1], [-1, 0, 0, -1, 0, 1], [ 0, 1, 0, -1, 0, 1], [ 0, 0, 0, -1, 0, 0], [ 1, 0, 0, -1, 0, 1], [ 0, -1, 0, -1, 0, 1] ); $c = convolveND($a,$b,{m=>'d',b=>'p'}); ok( 4, all( abs($c - $ans_p) < 1e-15 ) ); $c = convolveND($a,$b,{m=>'f',b=>'p'}); ok( 5, all( abs($c - $ans_p) < 1e-15 ) ); $ans_t = pdl( [ 0, 0, 1, -1, 0, 1], [-1, 0, 0, -1, 0, 1], [ 0, 1, 0, -1, 0, 1], [ 0, 0, 0, -1, 0, 1], [ 1, 0, 0, -1, 0, 1], [ 0, 0, 0, 0, 1, 1] ); $c = convolveND($a,$b,{m=>'d',b=>'t'}); ok( 6, all( abs($c - $ans_t) < 1e-15 ) ); $c = convolveND($a,$b,{m=>'f',b=>'t'}); ok( 7, all( abs($c - $ans_t) < 1e-15 ) );