Primitive.pm (PDL-2.082) | : | Primitive.pm (PDL-2.083) | ||
---|---|---|---|---|
skipping to change at line 54 | skipping to change at line 54 | |||
=head1 SYNOPSIS | =head1 SYNOPSIS | |||
# Pulls in PDL::Primitive, among other modules. | # Pulls in PDL::Primitive, among other modules. | |||
use PDL; | use PDL; | |||
# Only pull in PDL::Primitive: | # Only pull in PDL::Primitive: | |||
use PDL::Primitive; | use PDL::Primitive; | |||
=cut | =cut | |||
#line 62 "Primitive.pm" | #line 63 "Primitive.pm" | |||
=head1 FUNCTIONS | =head1 FUNCTIONS | |||
=cut | =cut | |||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 inner | =head2 inner | |||
=for sig | =for sig | |||
Signature: (a(n); b(n); [o]c()) | Signature: (a(n); b(n); [o]c()) | |||
=for ref | =for ref | |||
Inner product over one dimension | Inner product over one dimension | |||
skipping to change at line 83 | skipping to change at line 81 | |||
=for bad | =for bad | |||
=for bad | =for bad | |||
If C<a() * b()> contains only bad data, | If C<a() * b()> contains only bad data, | |||
C<c()> is set bad. Otherwise C<c()> will have its bad flag cleared, | C<c()> is set bad. Otherwise C<c()> will have its bad flag cleared, | |||
as it will not contain any bad values. | as it will not contain any bad values. | |||
=cut | =cut | |||
#line 104 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*inner = \&PDL::inner; | *inner = \&PDL::inner; | |||
#line 111 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 outer | =head2 outer | |||
=for sig | =for sig | |||
Signature: (a(n); b(m); [o]c(n,m)) | Signature: (a(n); b(m); [o]c(n,m)) | |||
=for ref | =for ref | |||
outer product over one dimension | outer product over one dimension | |||
skipping to change at line 112 | skipping to change at line 104 | |||
Naturally, it is possible to achieve the effects of outer | Naturally, it is possible to achieve the effects of outer | |||
product simply by broadcasting over the "C<*>" | product simply by broadcasting over the "C<*>" | |||
operator but this function is provided for convenience. | operator but this function is provided for convenience. | |||
=for bad | =for bad | |||
outer processes bad values. | outer processes bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 142 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*outer = \&PDL::outer; | *outer = \&PDL::outer; | |||
#line 149 "Primitive.pm" | ||||
#line 105 "primitive.pd" | #line 105 "primitive.pd" | |||
=head2 x | =head2 x | |||
=for sig | =for sig | |||
Signature: (a(i,z), b(x,i),[o]c(x,z)) | Signature: (a(i,z), b(x,i),[o]c(x,z)) | |||
=for ref | =for ref | |||
skipping to change at line 210 | skipping to change at line 198 | |||
[3 6] | [3 6] | |||
[4 8] | [4 8] | |||
] | ] | |||
INTERNALS | INTERNALS | |||
The mechanics of the multiplication are carried out by the | The mechanics of the multiplication are carried out by the | |||
L</matmult> method. | L</matmult> method. | |||
=cut | =cut | |||
#line 244 "Primitive.pm" | #line 227 "Primitive.pm" | |||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 matmult | =head2 matmult | |||
=for sig | =for sig | |||
Signature: (a(t,h); b(w,t); [o]c(w,h)) | Signature: (a(t,h); b(w,t); [o]c(w,h)) | |||
=for ref | =for ref | |||
Matrix multiplication | Matrix multiplication | |||
skipping to change at line 241 | skipping to change at line 227 | |||
footprint within cache as long as possible on most modern CPUs. | footprint within cache as long as possible on most modern CPUs. | |||
For usage, see L</x>, a description of the overloaded 'x' operator | For usage, see L</x>, a description of the overloaded 'x' operator | |||
=for bad | =for bad | |||
matmult ignores the bad-value flag of the input ndarrays. | matmult ignores the bad-value flag of the input ndarrays. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 282 "Primitive.pm" | ||||
#line 959 "../../blib/lib/PDL/PP.pm" | ||||
#line 203 "primitive.pd" | ||||
sub PDL::matmult { | sub PDL::matmult { | |||
my ($x,$y,$c) = @_; | my ($x,$y,$c) = @_; | |||
$y = PDL->topdl($y); | $y = PDL->topdl($y); | |||
$c = PDL->null unless do { local $@; eval { $c->isa('PDL') } }; | $c = PDL->null unless do { local $@; eval { $c->isa('PDL') } }; | |||
while($x->getndims < 2) {$x = $x->dummy(-1)} | while($x->getndims < 2) {$x = $x->dummy(-1)} | |||
while($y->getndims < 2) {$y = $y->dummy(-1)} | while($y->getndims < 2) {$y = $y->dummy(-1)} | |||
return ($c .= $x * $y) if( ($x->dim(0)==1 && $x->dim(1)==1) || | return ($c .= $x * $y) if( ($x->dim(0)==1 && $x->dim(1)==1) || | |||
($y->dim(0)==1 && $y->dim(1)==1) ); | ($y->dim(0)==1 && $y->dim(1)==1) ); | |||
barf sprintf 'Dim mismatch in matmult of [%1$dx%2$d] x [%3$dx%4$d]: %1$d != %4$d',$x->dim(0),$x->dim(1),$y->dim(0),$y->dim(1) | barf sprintf 'Dim mismatch in matmult of [%1$dx%2$d] x [%3$dx%4$d]: %1$d != %4$d',$x->dim(0),$x->dim(1),$y->dim(0),$y->dim(1) | |||
if $y->dim(1) != $x->dim(0); | if $y->dim(1) != $x->dim(0); | |||
PDL::_matmult_int($x,$y,$c); | PDL::_matmult_int($x,$y,$c); | |||
$c; | $c; | |||
} | } | |||
#line 301 "Primitive.pm" | #line 275 "Primitive.pm" | |||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*matmult = \&PDL::matmult; | *matmult = \&PDL::matmult; | |||
#line 308 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 innerwt | =head2 innerwt | |||
=for sig | =for sig | |||
Signature: (a(n); b(n); c(n); [o]d()) | Signature: (a(n); b(n); c(n); [o]d()) | |||
=for ref | =for ref | |||
Weighted (i.e. triple) inner product | Weighted (i.e. triple) inner product | |||
d = sum_i a(i) b(i) c(i) | d = sum_i a(i) b(i) c(i) | |||
=for bad | =for bad | |||
innerwt processes bad values. | innerwt processes bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 339 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*innerwt = \&PDL::innerwt; | *innerwt = \&PDL::innerwt; | |||
#line 346 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 inner2 | =head2 inner2 | |||
=for sig | =for sig | |||
Signature: (a(n); b(n,m); c(m); [o]d()) | Signature: (a(n); b(n,m); c(m); [o]d()) | |||
=for ref | =for ref | |||
Inner product of two vectors and a matrix | Inner product of two vectors and a matrix | |||
skipping to change at line 315 | skipping to change at line 288 | |||
Note that you should probably not broadcast over C<a> and C<c> since that would be | Note that you should probably not broadcast over C<a> and C<c> since that would be | |||
very wasteful. Instead, you should use a temporary for C<b*c>. | very wasteful. Instead, you should use a temporary for C<b*c>. | |||
=for bad | =for bad | |||
inner2 processes bad values. | inner2 processes bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 378 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*inner2 = \&PDL::inner2; | *inner2 = \&PDL::inner2; | |||
#line 385 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 inner2d | =head2 inner2d | |||
=for sig | =for sig | |||
Signature: (a(n,m); b(n,m); [o]c()) | Signature: (a(n,m); b(n,m); [o]c()) | |||
=for ref | =for ref | |||
Inner product over 2 dimensions. | Inner product over 2 dimensions. | |||
skipping to change at line 344 | skipping to change at line 311 | |||
Equivalent to | Equivalent to | |||
$c = inner($x->clump(2), $y->clump(2)) | $c = inner($x->clump(2), $y->clump(2)) | |||
=for bad | =for bad | |||
inner2d processes bad values. | inner2d processes bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 418 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*inner2d = \&PDL::inner2d; | *inner2d = \&PDL::inner2d; | |||
#line 425 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 inner2t | =head2 inner2t | |||
=for sig | =for sig | |||
Signature: (a(j,n); b(n,m); c(m,k); [t]tmp(n,k); [o]d(j,k))) | Signature: (a(j,n); b(n,m); c(m,k); [t]tmp(n,k); [o]d(j,k))) | |||
=for ref | =for ref | |||
Efficient Triple matrix product C<a*b*c> | Efficient Triple matrix product C<a*b*c> | |||
skipping to change at line 381 | skipping to change at line 342 | |||
It is hoped that things like this could be taken care of as a kind of | It is hoped that things like this could be taken care of as a kind of | |||
closures at some point. | closures at some point. | |||
=for bad | =for bad | |||
inner2t processes bad values. | inner2t processes bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 465 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*inner2t = \&PDL::inner2t; | *inner2t = \&PDL::inner2t; | |||
#line 472 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 crossp | =head2 crossp | |||
=for sig | =for sig | |||
Signature: (a(tri=3); b(tri); [o] c(tri)) | Signature: (a(tri=3); b(tri); [o] c(tri)) | |||
=for ref | =for ref | |||
Cross product of two 3D vectors | Cross product of two 3D vectors | |||
skipping to change at line 415 | skipping to change at line 370 | |||
the inner product C<$c*$x> and C<$c*$y> will be zero, i.e. C<$c> is | the inner product C<$c*$x> and C<$c*$y> will be zero, i.e. C<$c> is | |||
orthogonal to C<$x> and C<$y> | orthogonal to C<$x> and C<$y> | |||
=for bad | =for bad | |||
crossp does not process bad values. | crossp does not process bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 509 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*crossp = \&PDL::crossp; | *crossp = \&PDL::crossp; | |||
#line 516 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 norm | =head2 norm | |||
=for sig | =for sig | |||
Signature: (vec(n); [o] norm(n)) | Signature: (vec(n); [o] norm(n)) | |||
=for ref | =for ref | |||
Normalises a vector to unit Euclidean length | Normalises a vector to unit Euclidean length | |||
=for bad | =for bad | |||
norm processes bad values. | norm processes bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 541 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*norm = \&PDL::norm; | *norm = \&PDL::norm; | |||
#line 548 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 indadd | =head2 indadd | |||
=for sig | =for sig | |||
Signature: (input(n); indx ind(n); [io] sum(m)) | Signature: (input(n); indx ind(n); [io] sum(m)) | |||
=for ref | =for ref | |||
Broadcasting index add: add C<input> to the C<ind> element of C<sum>, i.e: | Broadcasting index add: add C<input> to the C<ind> element of C<sum>, i.e: | |||
skipping to change at line 490 | skipping to change at line 433 | |||
#Result: ( 1, 2, and 3 added to elements 1,4,6 $sum) | #Result: ( 1, 2, and 3 added to elements 1,4,6 $sum) | |||
# [0 1 0 0 2 0 3 0 0 0] | # [0 1 0 0 2 0 3 0 0 0] | |||
=for bad | =for bad | |||
=for bad | =for bad | |||
The routine barfs on bad indices, and bad inputs set target outputs bad. | The routine barfs on bad indices, and bad inputs set target outputs bad. | |||
=cut | =cut | |||
#line 602 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*indadd = \&PDL::indadd; | *indadd = \&PDL::indadd; | |||
#line 609 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 conv1d | =head2 conv1d | |||
=for sig | =for sig | |||
Signature: (a(m); kern(p); [o]b(m); int reflect) | Signature: (a(m); kern(p); [o]b(m); int reflect) | |||
=for ref | =for ref | |||
1D convolution along first dimension | 1D convolution along first dimension | |||
skipping to change at line 561 | skipping to change at line 498 | |||
the numeric value of C<< $pdl->badvalue >> so it is not | the numeric value of C<< $pdl->badvalue >> so it is not | |||
recommended for processing pdls with bad values in them | recommended for processing pdls with bad values in them | |||
unless special care is taken. | unless special care is taken. | |||
=for bad | =for bad | |||
conv1d ignores the bad-value flag of the input ndarrays. | conv1d ignores the bad-value flag of the input ndarrays. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 684 "Primitive.pm" | ||||
#line 959 "../../blib/lib/PDL/PP.pm" | ||||
#line 623 "primitive.pd" | ||||
sub PDL::conv1d { | sub PDL::conv1d { | |||
my $opt = pop @_ if ref($_[-1]) eq 'HASH'; | my $opt = pop @_ if ref($_[-1]) eq 'HASH'; | |||
die 'Usage: conv1d( a(m), kern(p), [o]b(m), {Options} )' | die 'Usage: conv1d( a(m), kern(p), [o]b(m), {Options} )' | |||
if @_<2 || @_>3; | if @_<2 || @_>3; | |||
my($x,$kern) = @_; | my($x,$kern) = @_; | |||
my $c = @_ == 3 ? $_[2] : PDL->null; | my $c = @_ == 3 ? $_[2] : PDL->null; | |||
PDL::_conv1d_int($x,$kern,$c, | PDL::_conv1d_int($x,$kern,$c, | |||
!(defined $opt && exists $$opt{Boundary}) ? 0 : | !(defined $opt && exists $$opt{Boundary}) ? 0 : | |||
lc $$opt{Boundary} eq "reflect"); | lc $$opt{Boundary} eq "reflect"); | |||
return $c; | return $c; | |||
} | } | |||
#line 703 "Primitive.pm" | #line 609 "Primitive.pm" | |||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*conv1d = \&PDL::conv1d; | *conv1d = \&PDL::conv1d; | |||
#line 710 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 in | =head2 in | |||
=for sig | =for sig | |||
Signature: (a(); b(n); [o] c()) | Signature: (a(); b(n); [o] c()) | |||
=for ref | =for ref | |||
test if a is in the set of values b | test if a is in the set of values b | |||
skipping to change at line 616 | skipping to change at line 546 | |||
However, C<in> doesn't create a (potentially large) intermediate | However, C<in> doesn't create a (potentially large) intermediate | |||
and is generally faster. | and is generally faster. | |||
=for bad | =for bad | |||
in does not process bad values. | in does not process bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 753 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*in = \&PDL::in; | *in = \&PDL::in; | |||
#line 760 "Primitive.pm" | ||||
#line 698 "primitive.pd" | #line 696 "primitive.pd" | |||
=head2 uniq | =head2 uniq | |||
=for ref | =for ref | |||
return all unique elements of an ndarray | return all unique elements of an ndarray | |||
The unique elements are returned in ascending order. | The unique elements are returned in ascending order. | |||
=for example | =for example | |||
skipping to change at line 680 | skipping to change at line 606 | |||
my $srt = $aflat->where($aflat==$aflat)->qsort; # no NaNs or BADs for qsort | my $srt = $aflat->where($aflat==$aflat)->qsort; # no NaNs or BADs for qsort | |||
my $nans = $aflat->where($aflat!=$aflat); | my $nans = $aflat->where($aflat!=$aflat); | |||
my $uniq = ($srt->nelem > 1) ? $srt->where($srt != $srt->rotate(-1)) : $srt; | my $uniq = ($srt->nelem > 1) ? $srt->where($srt != $srt->rotate(-1)) : $srt; | |||
# make sure we return something if there is only one value | # make sure we return something if there is only one value | |||
( | ( | |||
$uniq->nelem > 0 ? $uniq : | $uniq->nelem > 0 ? $uniq : | |||
$srt->nelem == 0 ? $srt : | $srt->nelem == 0 ? $srt : | |||
PDL::pdl( ref($srt), [$srt->index(0)] ) | PDL::pdl( ref($srt), [$srt->index(0)] ) | |||
)->append($nans); | )->append($nans); | |||
} | } | |||
#line 821 "Primitive.pm" | ||||
#line 757 "primitive.pd" | ||||
#line 755 "primitive.pd" | ||||
=head2 uniqind | =head2 uniqind | |||
=for ref | =for ref | |||
Return the indices of all unique elements of an ndarray | Return the indices of all unique elements of an ndarray | |||
The order is in the order of the values to be consistent | The order is in the order of the values to be consistent | |||
with uniq. C<NaN> values never compare equal with any | with uniq. C<NaN> values never compare equal with any | |||
other value and so are always unique. This follows the | other value and so are always unique. This follows the | |||
Matlab usage. | Matlab usage. | |||
skipping to change at line 744 | skipping to change at line 668 | |||
} | } | |||
# Now map back to the original space | # Now map back to the original space | |||
my $ansind = $nanind; | my $ansind = $nanind; | |||
if ( $uniqind->nelem > 0 ) { | if ( $uniqind->nelem > 0 ) { | |||
$ansind = ($good->index($i_srt->index($uniqind)))->append($ansind); | $ansind = ($good->index($i_srt->index($uniqind)))->append($ansind); | |||
} else { | } else { | |||
$ansind = $uniqind->append($ansind); | $ansind = $uniqind->append($ansind); | |||
} | } | |||
return $ansind; | return $ansind; | |||
} | } | |||
#line 888 "Primitive.pm" | ||||
#line 823 "primitive.pd" | ||||
#line 821 "primitive.pd" | ||||
=head2 uniqvec | =head2 uniqvec | |||
=for ref | =for ref | |||
Return all unique vectors out of a collection | Return all unique vectors out of a collection | |||
NOTE: If any vectors in the input ndarray have NaN values | NOTE: If any vectors in the input ndarray have NaN values | |||
they are returned at the end of the non-NaN ones. This is | they are returned at the end of the non-NaN ones. This is | |||
because, by definition, NaN values never compare equal with | because, by definition, NaN values never compare equal with | |||
any other value. | any other value. | |||
skipping to change at line 815 | skipping to change at line 737 | |||
my $uniq = $srtdice->nelem > 0 | my $uniq = $srtdice->nelem > 0 | |||
? ($srtdice != $srtdice->rotate(-1))->mv(0,-1)->orover->which | ? ($srtdice != $srtdice->rotate(-1))->mv(0,-1)->orover->which | |||
: $srtdice->orover->which; | : $srtdice->orover->which; | |||
my $ans = $uniq->nelem > 0 ? $srtdice->dice($uniq) : | my $ans = $uniq->nelem > 0 ? $srtdice->dice($uniq) : | |||
($srtdice->nelem > 0) ? $srtdice->slice("0,:") : | ($srtdice->nelem > 0) ? $srtdice->slice("0,:") : | |||
$srtdice; | $srtdice; | |||
return $ans->append($somebad)->append($nanvec->mv(0,-1))->mv(0,-1); | return $ans->append($somebad)->append($nanvec->mv(0,-1))->mv(0,-1); | |||
} | } | |||
#line 961 "Primitive.pm" | #line 847 "Primitive.pm" | |||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 hclip | =head2 hclip | |||
=for sig | =for sig | |||
Signature: (a(); b(); [o] c()) | Signature: (a(); b(); [o] c()) | |||
=for ref | =for ref | |||
clip (threshold) C<$a> by C<$b> (C<$b> is upper bound) | clip (threshold) C<$a> by C<$b> (C<$b> is upper bound) | |||
=for bad | =for bad | |||
hclip processes bad values. | hclip processes bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 986 "Primitive.pm" | ||||
#line 959 "../../blib/lib/PDL/PP.pm" | ||||
#line 916 "primitive.pd" | ||||
sub PDL::hclip { | sub PDL::hclip { | |||
my ($x,$y) = @_; | my ($x,$y) = @_; | |||
my $c; | my $c; | |||
if ($x->is_inplace) { | if ($x->is_inplace) { | |||
$x->set_inplace(0); $c = $x; | $x->set_inplace(0); $c = $x; | |||
} elsif (@_ > 2) {$c=$_[2]} else {$c=PDL->nullcreate($x)} | } elsif (@_ > 2) {$c=$_[2]} else {$c=PDL->nullcreate($x)} | |||
PDL::_hclip_int($x,$y,$c); | PDL::_hclip_int($x,$y,$c); | |||
return $c; | return $c; | |||
} | } | |||
#line 1001 "Primitive.pm" | #line 880 "Primitive.pm" | |||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*hclip = \&PDL::hclip; | *hclip = \&PDL::hclip; | |||
#line 1008 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 lclip | =head2 lclip | |||
=for sig | =for sig | |||
Signature: (a(); b(); [o] c()) | Signature: (a(); b(); [o] c()) | |||
=for ref | =for ref | |||
clip (threshold) C<$a> by C<$b> (C<$b> is lower bound) | clip (threshold) C<$a> by C<$b> (C<$b> is lower bound) | |||
=for bad | =for bad | |||
lclip processes bad values. | lclip processes bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 1033 "Primitive.pm" | ||||
#line 959 "../../blib/lib/PDL/PP.pm" | ||||
#line 916 "primitive.pd" | ||||
sub PDL::lclip { | sub PDL::lclip { | |||
my ($x,$y) = @_; | my ($x,$y) = @_; | |||
my $c; | my $c; | |||
if ($x->is_inplace) { | if ($x->is_inplace) { | |||
$x->set_inplace(0); $c = $x; | $x->set_inplace(0); $c = $x; | |||
} elsif (@_ > 2) {$c=$_[2]} else {$c=PDL->nullcreate($x)} | } elsif (@_ > 2) {$c=$_[2]} else {$c=PDL->nullcreate($x)} | |||
PDL::_lclip_int($x,$y,$c); | PDL::_lclip_int($x,$y,$c); | |||
return $c; | return $c; | |||
} | } | |||
#line 1048 "Primitive.pm" | #line 920 "Primitive.pm" | |||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*lclip = \&PDL::lclip; | *lclip = \&PDL::lclip; | |||
#line 1055 "Primitive.pm" | ||||
#line 933 "primitive.pd" | #line 931 "primitive.pd" | |||
=head2 clip | =head2 clip | |||
=for ref | =for ref | |||
Clip (threshold) an ndarray by (optional) upper or lower bounds. | Clip (threshold) an ndarray by (optional) upper or lower bounds. | |||
=for usage | =for usage | |||
$y = $x->clip(0,3); | $y = $x->clip(0,3); | |||
$c = $x->clip(undef, $x); | $c = $x->clip(undef, $x); | |||
=for bad | =for bad | |||
clip handles bad values since it is just a | clip handles bad values since it is just a | |||
wrapper around L</hclip> and | wrapper around L</hclip> and | |||
L</lclip>. | L</lclip>. | |||
=cut | =cut | |||
#line 1079 "Primitive.pm" | #line 948 "Primitive.pm" | |||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 clip | =head2 clip | |||
=for sig | =for sig | |||
Signature: (a(); l(); h(); [o] c()) | Signature: (a(); l(); h(); [o] c()) | |||
=for ref | =for ref | |||
info not available | info not available | |||
=for bad | =for bad | |||
clip processes bad values. | clip processes bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 1106 "Primitive.pm" | ||||
#line 959 "../../blib/lib/PDL/PP.pm" | ||||
#line 965 "primitive.pd" | ||||
*clip = \&PDL::clip; | *clip = \&PDL::clip; | |||
sub PDL::clip { | sub PDL::clip { | |||
my($x, $l, $h) = @_; | my($x, $l, $h) = @_; | |||
my $d; | my $d; | |||
unless(defined($l) || defined($h)) { | unless(defined($l) || defined($h)) { | |||
# Deal with pathological case | # Deal with pathological case | |||
if($x->is_inplace) { | if($x->is_inplace) { | |||
$x->set_inplace(0); | $x->set_inplace(0); | |||
return $x; | return $x; | |||
} else { | } else { | |||
skipping to change at line 970 | skipping to change at line 874 | |||
} elsif( defined($l) ) { | } elsif( defined($l) ) { | |||
PDL::_lclip_int($x,$l,$d); | PDL::_lclip_int($x,$l,$d); | |||
} elsif( defined($h) ) { | } elsif( defined($h) ) { | |||
PDL::_hclip_int($x,$h,$d); | PDL::_hclip_int($x,$h,$d); | |||
} else { | } else { | |||
die "This can't happen (clip contingency) - file a bug"; | die "This can't happen (clip contingency) - file a bug"; | |||
} | } | |||
return $d; | return $d; | |||
} | } | |||
#line 1145 "Primitive.pm" | #line 1005 "Primitive.pm" | |||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*clip = \&PDL::clip; | *clip = \&PDL::clip; | |||
#line 1152 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 wtstat | =head2 wtstat | |||
=for sig | =for sig | |||
Signature: (a(n); wt(n); avg(); [o]b(); int deg) | Signature: (a(n); wt(n); avg(); [o]b(); int deg) | |||
=for ref | =for ref | |||
Weighted statistical moment of given degree | Weighted statistical moment of given degree | |||
skipping to change at line 1002 | skipping to change at line 901 | |||
b() = (sum_i wt_i * (a_i ** degree - avg)) / (sum_i wt_i) | b() = (sum_i wt_i * (a_i ** degree - avg)) / (sum_i wt_i) | |||
=for bad | =for bad | |||
=for bad | =for bad | |||
Bad values are ignored in any calculation; C<$b> will only | Bad values are ignored in any calculation; C<$b> will only | |||
have its bad flag set if the output contains any bad data. | have its bad flag set if the output contains any bad data. | |||
=cut | =cut | |||
#line 1186 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*wtstat = \&PDL::wtstat; | *wtstat = \&PDL::wtstat; | |||
#line 1193 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 statsover | =head2 statsover | |||
=for sig | =for sig | |||
Signature: (a(n); w(n); float+ [o]avg(); float+ [o]prms(); int+ [o]median(); i nt+ [o]min(); int+ [o]max(); float+ [o]adev(); float+ [o]rms()) | Signature: (a(n); w(n); float+ [o]avg(); float+ [o]prms(); int+ [o]median(); i nt+ [o]min(); int+ [o]max(); float+ [o]adev(); float+ [o]rms()) | |||
=for ref | =for ref | |||
Calculate useful statistics over a dimension of an ndarray | Calculate useful statistics over a dimension of an ndarray | |||
skipping to change at line 1079 | skipping to change at line 972 | |||
use C<clump(-1)> directly on the ndarray or call C<stats>. | use C<clump(-1)> directly on the ndarray or call C<stats>. | |||
=for bad | =for bad | |||
=for bad | =for bad | |||
Bad values are simply ignored in the calculation, effectively reducing | Bad values are simply ignored in the calculation, effectively reducing | |||
the sample size. If all data are bad then the output data are marked bad. | the sample size. If all data are bad then the output data are marked bad. | |||
=cut | =cut | |||
#line 1274 "Primitive.pm" | ||||
#line 959 "../../blib/lib/PDL/PP.pm" | ||||
#line 1099 "primitive.pd" | ||||
sub PDL::statsover { | sub PDL::statsover { | |||
barf('Usage: ($mean,[$prms, $median, $min, $max, $adev, $rms]) = statsover($d ata,[$weights])') if @_>2; | barf('Usage: ($mean,[$prms, $median, $min, $max, $adev, $rms]) = statsover($d ata,[$weights])') if @_>2; | |||
my ($data, $weights) = @_; | my ($data, $weights) = @_; | |||
$weights //= $data->ones(); | $weights //= $data->ones(); | |||
my $median = $data->medover; | my $median = $data->medover; | |||
my $mean = PDL->nullcreate($data); | my $mean = PDL->nullcreate($data); | |||
my $rms = PDL->nullcreate($data); | my $rms = PDL->nullcreate($data); | |||
my $min = PDL->nullcreate($data); | my $min = PDL->nullcreate($data); | |||
my $max = PDL->nullcreate($data); | my $max = PDL->nullcreate($data); | |||
my $adev = PDL->nullcreate($data); | my $adev = PDL->nullcreate($data); | |||
my $prms = PDL->nullcreate($data); | my $prms = PDL->nullcreate($data); | |||
PDL::_statsover_int($data, $weights, $mean, $prms, $median, $min, $max, $adev , $rms); | PDL::_statsover_int($data, $weights, $mean, $prms, $median, $min, $max, $adev , $rms); | |||
wantarray ? ($mean, $prms, $median, $min, $max, $adev, $rms) : $mean; | wantarray ? ($mean, $prms, $median, $min, $max, $adev, $rms) : $mean; | |||
} | } | |||
#line 1295 "Primitive.pm" | #line 1136 "Primitive.pm" | |||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*statsover = \&PDL::statsover; | *statsover = \&PDL::statsover; | |||
#line 1302 "Primitive.pm" | ||||
#line 1184 "primitive.pd" | #line 1182 "primitive.pd" | |||
=head2 stats | =head2 stats | |||
=for ref | =for ref | |||
Calculates useful statistics on an ndarray | Calculates useful statistics on an ndarray | |||
=for usage | =for usage | |||
($mean,$prms,$median,$min,$max,$adev,$rms) = stats($ndarray,[$weights]); | ($mean,$prms,$median,$min,$max,$adev,$rms) = stats($ndarray,[$weights]); | |||
skipping to change at line 1148 | skipping to change at line 1036 | |||
if( ($weights->ndims != $data->ndims) or | if( ($weights->ndims != $data->ndims) or | |||
(pdl($weights->dims) != pdl($data->dims))->or | (pdl($weights->dims) != pdl($data->dims))->or | |||
) { | ) { | |||
$weights = $weights + zeroes($data) | $weights = $weights + zeroes($data) | |||
} | } | |||
$weights = $weights->flat; | $weights = $weights->flat; | |||
} | } | |||
return PDL::statsover($data->flat,$weights); | return PDL::statsover($data->flat,$weights); | |||
} | } | |||
#line 1350 "Primitive.pm" | #line 1188 "Primitive.pm" | |||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 histogram | =head2 histogram | |||
=for sig | =for sig | |||
Signature: (in(n); int+[o] hist(m); double step; double min; int msize => m) | Signature: (in(n); int+[o] hist(m); double step; double min; int msize => m) | |||
=for ref | =for ref | |||
Calculates a histogram for given stepsize and minimum. | Calculates a histogram for given stepsize and minimum. | |||
skipping to change at line 1192 | skipping to change at line 1078 | |||
pdl> p histogram(pdl(1,1,2),1,0,3) | pdl> p histogram(pdl(1,1,2),1,0,3) | |||
[0 2 1] | [0 2 1] | |||
=for bad | =for bad | |||
histogram processes bad values. | histogram processes bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 1402 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*histogram = \&PDL::histogram; | *histogram = \&PDL::histogram; | |||
#line 1409 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 whistogram | =head2 whistogram | |||
=for sig | =for sig | |||
Signature: (in(n); float+ wt(n);float+[o] hist(m); double step; double min; in t msize => m) | Signature: (in(n); float+ wt(n);float+[o] hist(m); double step; double min; in t msize => m) | |||
=for ref | =for ref | |||
Calculates a histogram from weighted data for given stepsize and minimum. | Calculates a histogram from weighted data for given stepsize and minimum. | |||
skipping to change at line 1239 | skipping to change at line 1119 | |||
pdl> p whistogram(pdl(1,1,2), pdl(0.1,0.1,0.5), 1, 0, 4) | pdl> p whistogram(pdl(1,1,2), pdl(0.1,0.1,0.5), 1, 0, 4) | |||
[0 0.2 0.5 0] | [0 0.2 0.5 0] | |||
=for bad | =for bad | |||
whistogram processes bad values. | whistogram processes bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 1458 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*whistogram = \&PDL::whistogram; | *whistogram = \&PDL::whistogram; | |||
#line 1465 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 histogram2d | =head2 histogram2d | |||
=for sig | =for sig | |||
Signature: (ina(n); inb(n); int+[o] hist(ma,mb); double stepa; double mina; in t masize => ma; | Signature: (ina(n); inb(n); int+[o] hist(ma,mb); double stepa; double mina; in t masize => ma; | |||
double stepb; double minb; int mbsize => mb;) | double stepb; double minb; int mbsize => mb;) | |||
=for ref | =for ref | |||
skipping to change at line 1291 | skipping to change at line 1165 | |||
[0 2 2] | [0 2 2] | |||
[0 1 0] | [0 1 0] | |||
] | ] | |||
=for bad | =for bad | |||
histogram2d processes bad values. | histogram2d processes bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 1519 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*histogram2d = \&PDL::histogram2d; | *histogram2d = \&PDL::histogram2d; | |||
#line 1526 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 whistogram2d | =head2 whistogram2d | |||
=for sig | =for sig | |||
Signature: (ina(n); inb(n); float+ wt(n);float+[o] hist(ma,mb); double stepa; double mina; int masize => ma; | Signature: (ina(n); inb(n); float+ wt(n);float+[o] hist(ma,mb); double stepa; double mina; int masize => ma; | |||
double stepb; double minb; int mbsize => mb;) | double stepb; double minb; int mbsize => mb;) | |||
=for ref | =for ref | |||
skipping to change at line 1343 | skipping to change at line 1211 | |||
[ 0 0.5 0.9] | [ 0 0.5 0.9] | |||
[ 0 0.1 0] | [ 0 0.1 0] | |||
] | ] | |||
=for bad | =for bad | |||
whistogram2d processes bad values. | whistogram2d processes bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 1580 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*whistogram2d = \&PDL::whistogram2d; | *whistogram2d = \&PDL::whistogram2d; | |||
#line 1587 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 fibonacci | =head2 fibonacci | |||
=for sig | =for sig | |||
Signature: (i(n); indx [o]x(n)) | Signature: (i(n); indx [o]x(n)) | |||
=for ref | =for ref | |||
Constructor - a vector with Fibonacci's sequence | Constructor - a vector with Fibonacci's sequence | |||
=for bad | =for bad | |||
fibonacci does not process bad values. | fibonacci does not process bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 1612 "Primitive.pm" | ||||
#line 959 "../../blib/lib/PDL/PP.pm" | ||||
#line 1468 "primitive.pd" | ||||
sub fibonacci { ref($_[0]) && ref($_[0]) ne 'PDL::Type' ? $_[0]->fibonacci : PDL ->fibonacci(@_) } | sub fibonacci { ref($_[0]) && ref($_[0]) ne 'PDL::Type' ? $_[0]->fibonacci : PDL ->fibonacci(@_) } | |||
sub PDL::fibonacci{ | sub PDL::fibonacci{ | |||
my $x = &PDL::Core::_construct; | my $x = &PDL::Core::_construct; | |||
my $is_inplace = $x->is_inplace; | my $is_inplace = $x->is_inplace; | |||
my ($in, $out) = $x->clump(-1); | my ($in, $out) = $x->clump(-1); | |||
$out = $is_inplace ? $in->inplace : PDL->null; | $out = $is_inplace ? $in->inplace : PDL->null; | |||
PDL::_fibonacci_int($in, $out); | PDL::_fibonacci_int($in, $out); | |||
$out; | $out; | |||
} | } | |||
#line 1627 "Primitive.pm" | #line 1429 "Primitive.pm" | |||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
#line 1632 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 append | =head2 append | |||
=for sig | =for sig | |||
Signature: (a(n); b(m); [o] c(mn)) | Signature: (a(n); b(m); [o] c(mn)) | |||
=for ref | =for ref | |||
append two ndarrays by concatenating along their first dimensions | append two ndarrays by concatenating along their first dimensions | |||
skipping to change at line 1420 | skipping to change at line 1275 | |||
than two ndarrays along an arbitrary dimension, and | than two ndarrays along an arbitrary dimension, and | |||
L<cat|PDL::Core/cat>, which can append more than two ndarrays that all | L<cat|PDL::Core/cat>, which can append more than two ndarrays that all | |||
have the same sized dimensions. | have the same sized dimensions. | |||
=for bad | =for bad | |||
append does not process bad values. | append does not process bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 1675 "Primitive.pm" | ||||
#line 959 "../../blib/lib/PDL/PP.pm" | #line 1494 "primitive.pd" | |||
#line 1496 "primitive.pd" | ||||
sub PDL::append { | sub PDL::append { | |||
my ($i1, $i2, $o) = map PDL->topdl($_), @_; | my ($i1, $i2, $o) = map PDL->topdl($_), @_; | |||
if (grep $_->isempty, $i1, $i2) { | my $nempty = grep $_->isempty, $i1, $i2; | |||
if ($nempty == 2) { | ||||
my @dims = $i1->dims; | ||||
$dims[0] += $i2->dim(0); | ||||
return PDL->zeroes($i1->type, @dims); | ||||
} | ||||
if ($nempty == 1) { | ||||
if (!defined $o) { | if (!defined $o) { | |||
return $i2->isnull ? PDL->zeroes(0) : $i2->copy if $i1->isempty; | return $i2->isnull ? PDL->zeroes(0) : $i2->copy if $i1->isempty; | |||
return $i1->isnull ? PDL->zeroes(0) : $i1->copy; | return $i1->isnull ? PDL->zeroes(0) : $i1->copy; | |||
} else { | } else { | |||
$o .= $i2->isnull ? PDL->zeroes(0) : $i2, return $o if $i1->isempty; | $o .= $i2->isnull ? PDL->zeroes(0) : $i2, return $o if $i1->isempty; | |||
$o .= $i1->isnull ? PDL->zeroes(0) : $i1, return $o; | $o .= $i1->isnull ? PDL->zeroes(0) : $i1, return $o; | |||
} | } | |||
} | } | |||
$o //= PDL->null; | $o //= PDL->null; | |||
PDL::_append_int($i1, $i2->convert($i1->type), $o); | PDL::_append_int($i1, $i2->convert($i1->type), $o); | |||
$o; | $o; | |||
} | } | |||
#line 1700 "Primitive.pm" | #line 1492 "Primitive.pm" | |||
#line 1701 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*append = \&PDL::append; | *append = \&PDL::append; | |||
#line 1708 "Primitive.pm" | ||||
#line 1543 "primitive.pd" | #line 1547 "primitive.pd" | |||
=head2 glue | =head2 glue | |||
=for usage | =for usage | |||
$c = $x->glue(<dim>,$y,...) | $c = $x->glue(<dim>,$y,...) | |||
=for ref | =for ref | |||
Glue two or more PDLs together along an arbitrary dimension | Glue two or more PDLs together along an arbitrary dimension | |||
skipping to change at line 1524 | skipping to change at line 1378 | |||
next unless(defined $y && $y->nelem); | next unless(defined $y && $y->nelem); | |||
while($dim >= $y->ndims) { | while($dim >= $y->ndims) { | |||
$y = $y->dummy(-1,1); | $y = $y->dummy(-1,1); | |||
} | } | |||
$y = $y->xchg(0,$dim); | $y = $y->xchg(0,$dim); | |||
$x = $x->append($y); | $x = $x->append($y); | |||
} | } | |||
$x->xchg(0,$dim); | $x->xchg(0,$dim); | |||
} | } | |||
#line 1786 "Primitive.pm" | #line 1574 "Primitive.pm" | |||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*axisvalues = \&PDL::axisvalues; | *axisvalues = \&PDL::axisvalues; | |||
#line 1793 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 cmpvec | =head2 cmpvec | |||
=for sig | =for sig | |||
Signature: (a(n); b(n); sbyte [o]c()) | Signature: (a(n); b(n); sbyte [o]c()) | |||
=for ref | =for ref | |||
Compare two vectors lexicographically. | Compare two vectors lexicographically. | |||
Returns -1 if a is less, 1 if greater, 0 if equal. | Returns -1 if a is less, 1 if greater, 0 if equal. | |||
=for bad | =for bad | |||
The output is bad if any input values up to the point of inequality are | The output is bad if any input values up to the point of inequality are | |||
bad - any after are ignored. | bad - any after are ignored. | |||
=cut | =cut | |||
#line 1822 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*cmpvec = \&PDL::cmpvec; | *cmpvec = \&PDL::cmpvec; | |||
#line 1829 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 eqvec | =head2 eqvec | |||
=for sig | =for sig | |||
Signature: (a(n); b(n); sbyte [o]c()) | Signature: (a(n); b(n); sbyte [o]c()) | |||
=for ref | =for ref | |||
Compare two vectors, returning 1 if equal, 0 if not equal. | Compare two vectors, returning 1 if equal, 0 if not equal. | |||
=for bad | =for bad | |||
The output is bad if any input values are bad. | The output is bad if any input values are bad. | |||
=cut | =cut | |||
#line 1854 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*eqvec = \&PDL::eqvec; | *eqvec = \&PDL::eqvec; | |||
#line 1861 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 enumvec | =head2 enumvec | |||
=for sig | =for sig | |||
Signature: (v(M,N); indx [o]k(N)) | Signature: (v(M,N); indx [o]k(N)) | |||
=for ref | =for ref | |||
Enumerate a list of vectors with locally unique keys. | Enumerate a list of vectors with locally unique keys. | |||
skipping to change at line 1609 | skipping to change at line 1446 | |||
If you need global keys, see enumvecg(). | If you need global keys, see enumvecg(). | |||
Contributed by Bryan Jurish E<lt>moocow@cpan.orgE<gt>. | Contributed by Bryan Jurish E<lt>moocow@cpan.orgE<gt>. | |||
=for bad | =for bad | |||
enumvec does not process bad values. | enumvec does not process bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 1896 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*enumvec = \&PDL::enumvec; | *enumvec = \&PDL::enumvec; | |||
#line 1903 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 enumvecg | =head2 enumvecg | |||
=for sig | =for sig | |||
Signature: (v(M,N); indx [o]k(N)) | Signature: (v(M,N); indx [o]k(N)) | |||
=for ref | =for ref | |||
Enumerate a list of vectors with globally unique keys. | Enumerate a list of vectors with globally unique keys. | |||
skipping to change at line 1644 | skipping to change at line 1475 | |||
... but somewhat more efficiently. | ... but somewhat more efficiently. | |||
Contributed by Bryan Jurish E<lt>moocow@cpan.orgE<gt>. | Contributed by Bryan Jurish E<lt>moocow@cpan.orgE<gt>. | |||
=for bad | =for bad | |||
enumvecg does not process bad values. | enumvecg does not process bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 1939 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*enumvecg = \&PDL::enumvecg; | *enumvecg = \&PDL::enumvecg; | |||
#line 1946 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 vsearchvec | =head2 vsearchvec | |||
=for sig | =for sig | |||
Signature: (find(M); which(M,N); indx [o]found()) | Signature: (find(M); which(M,N); indx [o]found()) | |||
=for ref | =for ref | |||
Routine for searching N-dimensional values - akin to vsearch() for vectors. | Routine for searching N-dimensional values - akin to vsearch() for vectors. | |||
skipping to change at line 1685 | skipping to change at line 1510 | |||
See also: L</vsearch>. | See also: L</vsearch>. | |||
Contributed by Bryan Jurish E<lt>moocow@cpan.orgE<gt>. | Contributed by Bryan Jurish E<lt>moocow@cpan.orgE<gt>. | |||
=for bad | =for bad | |||
vsearchvec does not process bad values. | vsearchvec does not process bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 1988 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*vsearchvec = \&PDL::vsearchvec; | *vsearchvec = \&PDL::vsearchvec; | |||
#line 1995 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 unionvec | =head2 unionvec | |||
=for sig | =for sig | |||
Signature: (a(M,NA); b(M,NB); [o]c(M,NC); indx [o]nc()) | Signature: (a(M,NA); b(M,NB); [o]c(M,NC); indx [o]nc()) | |||
=for ref | =for ref | |||
Union of two vector-valued PDLs. | Union of two vector-valued PDLs. | |||
skipping to change at line 1718 | skipping to change at line 1537 | |||
and returns the sliced PDL. | and returns the sliced PDL. | |||
Contributed by Bryan Jurish E<lt>moocow@cpan.orgE<gt>. | Contributed by Bryan Jurish E<lt>moocow@cpan.orgE<gt>. | |||
=for bad | =for bad | |||
unionvec does not process bad values. | unionvec does not process bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 2029 "Primitive.pm" | ||||
#line 959 "../../blib/lib/PDL/PP.pm" | ||||
#line 1821 "primitive.pd" | ||||
sub PDL::unionvec { | sub PDL::unionvec { | |||
my ($a,$b,$c,$nc) = @_; | my ($a,$b,$c,$nc) = @_; | |||
$c = PDL->null if (!defined($nc)); | $c = PDL->null if (!defined($nc)); | |||
$nc = PDL->null if (!defined($nc)); | $nc = PDL->null if (!defined($nc)); | |||
PDL::_unionvec_int($a,$b,$c,$nc); | PDL::_unionvec_int($a,$b,$c,$nc); | |||
return ($c,$nc) if (wantarray); | return ($c,$nc) if (wantarray); | |||
return $c->slice(",0:".($nc->max-1)); | return $c->slice(",0:".($nc->max-1)); | |||
} | } | |||
#line 2044 "Primitive.pm" | #line 1792 "Primitive.pm" | |||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*unionvec = \&PDL::unionvec; | *unionvec = \&PDL::unionvec; | |||
#line 2051 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 intersectvec | =head2 intersectvec | |||
=for sig | =for sig | |||
Signature: (a(M,NA); b(M,NB); [o]c(M,NC); indx [o]nc()) | Signature: (a(M,NA); b(M,NB); [o]c(M,NC); indx [o]nc()) | |||
=for ref | =for ref | |||
Intersection of two vector-valued PDLs. | Intersection of two vector-valued PDLs. | |||
skipping to change at line 1762 | skipping to change at line 1574 | |||
and returns the sliced PDL. | and returns the sliced PDL. | |||
Contributed by Bryan Jurish E<lt>moocow@cpan.orgE<gt>. | Contributed by Bryan Jurish E<lt>moocow@cpan.orgE<gt>. | |||
=for bad | =for bad | |||
intersectvec does not process bad values. | intersectvec does not process bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 2084 "Primitive.pm" | ||||
#line 959 "../../blib/lib/PDL/PP.pm" | ||||
#line 1883 "primitive.pd" | ||||
sub PDL::intersectvec { | sub PDL::intersectvec { | |||
my ($a,$b,$c,$nc) = @_; | my ($a,$b,$c,$nc) = @_; | |||
$c = PDL->null if (!defined($c)); | $c = PDL->null if (!defined($c)); | |||
$nc = PDL->null if (!defined($nc)); | $nc = PDL->null if (!defined($nc)); | |||
PDL::_intersectvec_int($a,$b,$c,$nc); | PDL::_intersectvec_int($a,$b,$c,$nc); | |||
return ($c,$nc) if (wantarray); | return ($c,$nc) if (wantarray); | |||
my $nc_max = $nc->max; | my $nc_max = $nc->max; | |||
return ($nc_max > 0 | return ($nc_max > 0 | |||
? $c->slice(",0:".($nc_max-1)) | ? $c->slice(",0:".($nc_max-1)) | |||
: $c->reshape($c->dim(0), 0, ($c->dims)[2..($c->ndims-1)])); | : $c->reshape($c->dim(0), 0, ($c->dims)[2..($c->ndims-1)])); | |||
} | } | |||
#line 2102 "Primitive.pm" | #line 1841 "Primitive.pm" | |||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*intersectvec = \&PDL::intersectvec; | *intersectvec = \&PDL::intersectvec; | |||
#line 2109 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 setdiffvec | =head2 setdiffvec | |||
=for sig | =for sig | |||
Signature: (a(M,NA); b(M,NB); [o]c(M,NC); indx [o]nc()) | Signature: (a(M,NA); b(M,NB); [o]c(M,NC); indx [o]nc()) | |||
=for ref | =for ref | |||
Set-difference ($a() \ $b()) of two vector-valued PDLs. | Set-difference ($a() \ $b()) of two vector-valued PDLs. | |||
skipping to change at line 1810 | skipping to change at line 1615 | |||
and returns the sliced PDL. | and returns the sliced PDL. | |||
Contributed by Bryan Jurish E<lt>moocow@cpan.orgE<gt>. | Contributed by Bryan Jurish E<lt>moocow@cpan.orgE<gt>. | |||
=for bad | =for bad | |||
setdiffvec does not process bad values. | setdiffvec does not process bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 2143 "Primitive.pm" | ||||
#line 959 "../../blib/lib/PDL/PP.pm" | ||||
#line 1941 "primitive.pd" | ||||
sub PDL::setdiffvec { | sub PDL::setdiffvec { | |||
my ($a,$b,$c,$nc) = @_; | my ($a,$b,$c,$nc) = @_; | |||
$c = PDL->null if (!defined($c)); | $c = PDL->null if (!defined($c)); | |||
$nc = PDL->null if (!defined($nc)); | $nc = PDL->null if (!defined($nc)); | |||
PDL::_setdiffvec_int($a,$b,$c,$nc); | PDL::_setdiffvec_int($a,$b,$c,$nc); | |||
return ($c,$nc) if (wantarray); | return ($c,$nc) if (wantarray); | |||
my $nc_max = $nc->max; | my $nc_max = $nc->max; | |||
return ($nc_max > 0 | return ($nc_max > 0 | |||
? $c->slice(",0:".($nc_max-1)) | ? $c->slice(",0:".($nc_max-1)) | |||
: $c->reshape($c->dim(0), 0, ($c->dims)[2..($c->ndims-1)])); | : $c->reshape($c->dim(0), 0, ($c->dims)[2..($c->ndims-1)])); | |||
} | } | |||
#line 2161 "Primitive.pm" | #line 1891 "Primitive.pm" | |||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*setdiffvec = \&PDL::setdiffvec; | *setdiffvec = \&PDL::setdiffvec; | |||
#line 2168 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 union_sorted | =head2 union_sorted | |||
=for sig | =for sig | |||
Signature: (a(NA); b(NB); [o]c(NC); indx [o]nc()) | Signature: (a(NA); b(NB); [o]c(NC); indx [o]nc()) | |||
=for ref | =for ref | |||
Union of two flat sorted unique-valued PDLs. | Union of two flat sorted unique-valued PDLs. | |||
skipping to change at line 1856 | skipping to change at line 1654 | |||
In scalar context, reshapes $c() to the actual number of elements in the union a nd returns it. | In scalar context, reshapes $c() to the actual number of elements in the union a nd returns it. | |||
Contributed by Bryan Jurish E<lt>moocow@cpan.orgE<gt>. | Contributed by Bryan Jurish E<lt>moocow@cpan.orgE<gt>. | |||
=for bad | =for bad | |||
union_sorted does not process bad values. | union_sorted does not process bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 2200 "Primitive.pm" | ||||
#line 959 "../../blib/lib/PDL/PP.pm" | ||||
#line 2010 "primitive.pd" | ||||
sub PDL::union_sorted { | sub PDL::union_sorted { | |||
my ($a,$b,$c,$nc) = @_; | my ($a,$b,$c,$nc) = @_; | |||
$c = PDL->null if (!defined($c)); | $c = PDL->null if (!defined($c)); | |||
$nc = PDL->null if (!defined($nc)); | $nc = PDL->null if (!defined($nc)); | |||
PDL::_union_sorted_int($a,$b,$c,$nc); | PDL::_union_sorted_int($a,$b,$c,$nc); | |||
return ($c,$nc) if (wantarray); | return ($c,$nc) if (wantarray); | |||
return $c->slice("0:".($nc->max-1)); | return $c->slice("0:".($nc->max-1)); | |||
} | } | |||
#line 2215 "Primitive.pm" | #line 1936 "Primitive.pm" | |||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*union_sorted = \&PDL::union_sorted; | *union_sorted = \&PDL::union_sorted; | |||
#line 2222 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 intersect_sorted | =head2 intersect_sorted | |||
=for sig | =for sig | |||
Signature: (a(NA); b(NB); [o]c(NC); indx [o]nc()) | Signature: (a(NA); b(NB); [o]c(NC); indx [o]nc()) | |||
=for ref | =for ref | |||
Intersection of two flat sorted unique-valued PDLs. | Intersection of two flat sorted unique-valued PDLs. | |||
skipping to change at line 1899 | skipping to change at line 1690 | |||
In scalar context, reshapes $c() to the actual number of elements in the interse ction and returns it. | In scalar context, reshapes $c() to the actual number of elements in the interse ction and returns it. | |||
Contributed by Bryan Jurish E<lt>moocow@cpan.orgE<gt>. | Contributed by Bryan Jurish E<lt>moocow@cpan.orgE<gt>. | |||
=for bad | =for bad | |||
intersect_sorted does not process bad values. | intersect_sorted does not process bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 2254 "Primitive.pm" | ||||
#line 959 "../../blib/lib/PDL/PP.pm" | ||||
#line 2070 "primitive.pd" | ||||
sub PDL::intersect_sorted { | sub PDL::intersect_sorted { | |||
my ($a,$b,$c,$nc) = @_; | my ($a,$b,$c,$nc) = @_; | |||
$c = PDL->null if (!defined($c)); | $c = PDL->null if (!defined($c)); | |||
$nc = PDL->null if (!defined($nc)); | $nc = PDL->null if (!defined($nc)); | |||
PDL::_intersect_sorted_int($a,$b,$c,$nc); | PDL::_intersect_sorted_int($a,$b,$c,$nc); | |||
return ($c,$nc) if (wantarray); | return ($c,$nc) if (wantarray); | |||
my $nc_max = $nc->max; | my $nc_max = $nc->max; | |||
return ($nc_max > 0 | return ($nc_max > 0 | |||
? $c->slice("0:".($nc_max-1)) | ? $c->slice("0:".($nc_max-1)) | |||
: $c->reshape(0, ($c->dims)[1..($c->ndims-1)])); | : $c->reshape(0, ($c->dims)[1..($c->ndims-1)])); | |||
} | } | |||
#line 2272 "Primitive.pm" | #line 1984 "Primitive.pm" | |||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*intersect_sorted = \&PDL::intersect_sorted; | *intersect_sorted = \&PDL::intersect_sorted; | |||
#line 2279 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 setdiff_sorted | =head2 setdiff_sorted | |||
=for sig | =for sig | |||
Signature: (a(NA); b(NB); [o]c(NC); indx [o]nc()) | Signature: (a(NA); b(NB); [o]c(NC); indx [o]nc()) | |||
=for ref | =for ref | |||
Set-difference ($a() \ $b()) of two flat sorted unique-valued PDLs. | Set-difference ($a() \ $b()) of two flat sorted unique-valued PDLs. | |||
skipping to change at line 1946 | skipping to change at line 1730 | |||
In scalar context, reshapes $c() to the actual number of elements in the differe nce set and returns it. | In scalar context, reshapes $c() to the actual number of elements in the differe nce set and returns it. | |||
Contributed by Bryan Jurish E<lt>moocow@cpan.orgE<gt>. | Contributed by Bryan Jurish E<lt>moocow@cpan.orgE<gt>. | |||
=for bad | =for bad | |||
setdiff_sorted does not process bad values. | setdiff_sorted does not process bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 2312 "Primitive.pm" | ||||
#line 959 "../../blib/lib/PDL/PP.pm" | ||||
#line 2127 "primitive.pd" | ||||
sub PDL::setdiff_sorted { | sub PDL::setdiff_sorted { | |||
my ($a,$b,$c,$nc) = @_; | my ($a,$b,$c,$nc) = @_; | |||
$c = PDL->null if (!defined($c)); | $c = PDL->null if (!defined($c)); | |||
$nc = PDL->null if (!defined($nc)); | $nc = PDL->null if (!defined($nc)); | |||
PDL::_setdiff_sorted_int($a,$b,$c,$nc); | PDL::_setdiff_sorted_int($a,$b,$c,$nc); | |||
return ($c,$nc) if (wantarray); | return ($c,$nc) if (wantarray); | |||
my $nc_max = $nc->max; | my $nc_max = $nc->max; | |||
return ($nc_max > 0 | return ($nc_max > 0 | |||
? $c->slice("0:".($nc_max-1)) | ? $c->slice("0:".($nc_max-1)) | |||
: $c->reshape(0, ($c->dims)[1..($c->ndims-1)])); | : $c->reshape(0, ($c->dims)[1..($c->ndims-1)])); | |||
} | } | |||
#line 2330 "Primitive.pm" | #line 2033 "Primitive.pm" | |||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*setdiff_sorted = \&PDL::setdiff_sorted; | *setdiff_sorted = \&PDL::setdiff_sorted; | |||
#line 2337 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 srand | =head2 srand | |||
=for sig | =for sig | |||
Signature: (a()) | Signature: (a()) | |||
=for ref | =for ref | |||
Seed random-number generator with a 64-bit int. Will generate seed data | Seed random-number generator with a 64-bit int. Will generate seed data | |||
skipping to change at line 1993 | skipping to change at line 1770 | |||
srand(); # uses current time | srand(); # uses current time | |||
srand(5); # fixed number e.g. for testing | srand(5); # fixed number e.g. for testing | |||
=for bad | =for bad | |||
srand does not process bad values. | srand does not process bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 2371 "Primitive.pm" | ||||
#line 959 "../../blib/lib/PDL/PP.pm" | ||||
#line 2227 "primitive.pd" | ||||
*srand = \&PDL::srand; | *srand = \&PDL::srand; | |||
sub PDL::srand { PDL::_srand_int($_[0] // PDL::Core::seed()) } | sub PDL::srand { PDL::_srand_int($_[0] // PDL::Core::seed()) } | |||
#line 2379 "Primitive.pm" | #line 2073 "Primitive.pm" | |||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*srand = \&PDL::srand; | *srand = \&PDL::srand; | |||
#line 2386 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 random | =head2 random | |||
=for sig | =for sig | |||
Signature: (a()) | Signature: ([o] a()) | |||
=for ref | =for ref | |||
Constructor which returns ndarray of random numbers | Constructor which returns ndarray of random numbers | |||
=for usage | =for usage | |||
$x = random([type], $nx, $ny, $nz,...); | $x = random([type], $nx, $ny, $nz,...); | |||
$x = random $y; | $x = random $y; | |||
skipping to change at line 2039 | skipping to change at line 1809 | |||
You can use the PDL function L</srand> to seed the random generator. | You can use the PDL function L</srand> to seed the random generator. | |||
If it has not been called yet, it will be with the current time. | If it has not been called yet, it will be with the current time. | |||
=for bad | =for bad | |||
random does not process bad values. | random does not process bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 2427 "Primitive.pm" | ||||
#line 959 "../../blib/lib/PDL/PP.pm" | ||||
#line 2266 "primitive.pd" | ||||
sub random { ref($_[0]) && ref($_[0]) ne 'PDL::Type' ? $_[0]->random : PDL->rand om(@_) } | sub random { ref($_[0]) && ref($_[0]) ne 'PDL::Type' ? $_[0]->random : PDL->rand om(@_) } | |||
sub PDL::random { | sub PDL::random { | |||
my $class = shift; | my $class = shift; | |||
unshift @_, double() if !ref($class) and !@_; | ||||
my $x = scalar(@_)? $class->new_from_specification(@_) : $class->new_or_inpla ce; | my $x = scalar(@_)? $class->new_from_specification(@_) : $class->new_or_inpla ce; | |||
PDL::_random_int($x); | PDL::_random_int($x); | |||
return $x; | return $x; | |||
} | } | |||
#line 2440 "Primitive.pm" | #line 2127 "Primitive.pm" | |||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
#line 2445 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 randsym | =head2 randsym | |||
=for sig | =for sig | |||
Signature: (a()) | Signature: ([o] a()) | |||
=for ref | =for ref | |||
Constructor which returns ndarray of random numbers | Constructor which returns ndarray of random numbers | |||
=for usage | =for usage | |||
$x = randsym([type], $nx, $ny, $nz,...); | $x = randsym([type], $nx, $ny, $nz,...); | |||
$x = randsym $y; | $x = randsym $y; | |||
skipping to change at line 2087 | skipping to change at line 1851 | |||
You can use the PDL function L</srand> to seed the random generator. | You can use the PDL function L</srand> to seed the random generator. | |||
If it has not been called yet, it will be with the current time. | If it has not been called yet, it will be with the current time. | |||
=for bad | =for bad | |||
randsym does not process bad values. | randsym does not process bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 2485 "Primitive.pm" | ||||
#line 959 "../../blib/lib/PDL/PP.pm" | ||||
#line 2312 "primitive.pd" | ||||
sub randsym { ref($_[0]) && ref($_[0]) ne 'PDL::Type' ? $_[0]->randsym : PDL->ra ndsym(@_) } | sub randsym { ref($_[0]) && ref($_[0]) ne 'PDL::Type' ? $_[0]->randsym : PDL->ra ndsym(@_) } | |||
sub PDL::randsym { | sub PDL::randsym { | |||
my $class = shift; | my $class = shift; | |||
unshift @_, double() if !ref($class) and !@_; | ||||
my $x = scalar(@_)? $class->new_from_specification(@_) : $class->new_or_inpla ce; | my $x = scalar(@_)? $class->new_from_specification(@_) : $class->new_or_inpla ce; | |||
PDL::_randsym_int($x); | PDL::_randsym_int($x); | |||
return $x; | return $x; | |||
} | } | |||
#line 2498 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
#line 2503 "Primitive.pm" | ||||
#line 2318 "primitive.pd" | ||||
#line 2324 "primitive.pd" | ||||
=head2 grandom | =head2 grandom | |||
=for ref | =for ref | |||
Constructor which returns ndarray of Gaussian random numbers | Constructor which returns ndarray of Gaussian random numbers | |||
=for usage | =for usage | |||
$x = grandom([type], $nx, $ny, $nz,...); | $x = grandom([type], $nx, $ny, $nz,...); | |||
$x = grandom $y; | $x = grandom $y; | |||
skipping to change at line 2135 | skipping to change at line 1893 | |||
=cut | =cut | |||
sub grandom { ref($_[0]) && ref($_[0]) ne 'PDL::Type' ? $_[0]->grandom : PDL->gr andom(@_) } | sub grandom { ref($_[0]) && ref($_[0]) ne 'PDL::Type' ? $_[0]->grandom : PDL->gr andom(@_) } | |||
sub PDL::grandom { | sub PDL::grandom { | |||
my $class = shift; | my $class = shift; | |||
my $x = scalar(@_)? $class->new_from_specification(@_) : $class->new_or_inpla ce; | my $x = scalar(@_)? $class->new_from_specification(@_) : $class->new_or_inpla ce; | |||
use PDL::Math 'ndtri'; | use PDL::Math 'ndtri'; | |||
$x .= ndtri(randsym($x)); | $x .= ndtri(randsym($x)); | |||
return $x; | return $x; | |||
} | } | |||
#line 2539 "Primitive.pm" | ||||
#line 2358 "primitive.pd" | ||||
#line 2364 "primitive.pd" | ||||
=head2 vsearch | =head2 vsearch | |||
=for sig | =for sig | |||
Signature: ( vals(); xs(n); [o] indx(); [\%options] ) | Signature: ( vals(); xs(n); [o] indx(); [\%options] ) | |||
=for ref | =for ref | |||
Efficiently search for values in a sorted ndarray, returning indices. | Efficiently search for values in a sorted ndarray, returning indices. | |||
skipping to change at line 2283 | skipping to change at line 2039 | |||
$mode eq 'sample' ? \&vsearch_sample | $mode eq 'sample' ? \&vsearch_sample | |||
: $mode eq 'insert_leftmost' ? \&vsearch_insert_leftmost | : $mode eq 'insert_leftmost' ? \&vsearch_insert_leftmost | |||
: $mode eq 'insert_rightmost' ? \&vsearch_insert_rightmost | : $mode eq 'insert_rightmost' ? \&vsearch_insert_rightmost | |||
: $mode eq 'match' ? \&vsearch_match | : $mode eq 'match' ? \&vsearch_match | |||
: $mode eq 'bin_inclusive' ? \&vsearch_bin_inclusive | : $mode eq 'bin_inclusive' ? \&vsearch_bin_inclusive | |||
: $mode eq 'bin_exclusive' ? \&vsearch_bin_exclusive | : $mode eq 'bin_exclusive' ? \&vsearch_bin_exclusive | |||
: croak( "unknown vsearch mode: $mode\n" ); | : croak( "unknown vsearch mode: $mode\n" ); | |||
} | } | |||
*PDL::vsearch = \&vsearch; | *PDL::vsearch = \&vsearch; | |||
#line 2690 "Primitive.pm" | #line 2351 "Primitive.pm" | |||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 vsearch_sample | =head2 vsearch_sample | |||
=for sig | =for sig | |||
Signature: (vals(); x(n); indx [o]idx()) | Signature: (vals(); x(n); indx [o]idx()) | |||
=for ref | =for ref | |||
Search for values in a sorted array, return index appropriate for sampling from a distribution | Search for values in a sorted array, return index appropriate for sampling from a distribution | |||
skipping to change at line 2351 | skipping to change at line 2105 | |||
$c = vsearch_sample($y, $x); # Now, $c will have the appropriate distr. | $c = vsearch_sample($y, $x); # Now, $c will have the appropriate distr. | |||
It is possible to use the L<cumusumover|PDL::Ufunc/cumusumover> | It is possible to use the L<cumusumover|PDL::Ufunc/cumusumover> | |||
function to obtain cumulative probabilities from absolute probabilities. | function to obtain cumulative probabilities from absolute probabilities. | |||
=for bad | =for bad | |||
needs major (?) work to handles bad values | needs major (?) work to handles bad values | |||
=cut | =cut | |||
#line 2784 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*vsearch_sample = \&PDL::vsearch_sample; | *vsearch_sample = \&PDL::vsearch_sample; | |||
#line 2791 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 vsearch_insert_leftmost | =head2 vsearch_insert_leftmost | |||
=for sig | =for sig | |||
Signature: (vals(); x(n); indx [o]idx()) | Signature: (vals(); x(n); indx [o]idx()) | |||
=for ref | =for ref | |||
Determine the insertion point for values in a sorted array, inserting before dup licates. | Determine the insertion point for values in a sorted array, inserting before dup licates. | |||
skipping to change at line 2420 | skipping to change at line 2168 | |||
i = 0 | i = 0 | |||
If C<$x> contains duplicated elements, I<I> is the index of the | If C<$x> contains duplicated elements, I<I> is the index of the | |||
leftmost (by index in array) duplicate if I<V> matches. | leftmost (by index in array) duplicate if I<V> matches. | |||
=for bad | =for bad | |||
needs major (?) work to handles bad values | needs major (?) work to handles bad values | |||
=cut | =cut | |||
#line 2881 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*vsearch_insert_leftmost = \&PDL::vsearch_insert_leftmost; | *vsearch_insert_leftmost = \&PDL::vsearch_insert_leftmost; | |||
#line 2888 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 vsearch_insert_rightmost | =head2 vsearch_insert_rightmost | |||
=for sig | =for sig | |||
Signature: (vals(); x(n); indx [o]idx()) | Signature: (vals(); x(n); indx [o]idx()) | |||
=for ref | =for ref | |||
Determine the insertion point for values in a sorted array, inserting after dupl icates. | Determine the insertion point for values in a sorted array, inserting after dupl icates. | |||
skipping to change at line 2489 | skipping to change at line 2231 | |||
i = $x->nelem - 1 | i = $x->nelem - 1 | |||
If C<$x> contains duplicated elements, I<I> is the index of the | If C<$x> contains duplicated elements, I<I> is the index of the | |||
leftmost (by index in array) duplicate if I<V> matches. | leftmost (by index in array) duplicate if I<V> matches. | |||
=for bad | =for bad | |||
needs major (?) work to handles bad values | needs major (?) work to handles bad values | |||
=cut | =cut | |||
#line 2978 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*vsearch_insert_rightmost = \&PDL::vsearch_insert_rightmost; | *vsearch_insert_rightmost = \&PDL::vsearch_insert_rightmost; | |||
#line 2985 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 vsearch_match | =head2 vsearch_match | |||
=for sig | =for sig | |||
Signature: (vals(); x(n); indx [o]idx()) | Signature: (vals(); x(n); indx [o]idx()) | |||
=for ref | =for ref | |||
Match values against a sorted array. | Match values against a sorted array. | |||
skipping to change at line 2527 | skipping to change at line 2263 | |||
index of that element, otherwise it is I<-( insertion_point + 1 )>, | index of that element, otherwise it is I<-( insertion_point + 1 )>, | |||
where I<insertion_point> is an index in C<$x> where I<V> may be | where I<insertion_point> is an index in C<$x> where I<V> may be | |||
inserted while maintaining the order in C<$x>. If C<$x> has | inserted while maintaining the order in C<$x>. If C<$x> has | |||
duplicated values, I<I> may refer to any of them. | duplicated values, I<I> may refer to any of them. | |||
=for bad | =for bad | |||
needs major (?) work to handles bad values | needs major (?) work to handles bad values | |||
=cut | =cut | |||
#line 3033 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*vsearch_match = \&PDL::vsearch_match; | *vsearch_match = \&PDL::vsearch_match; | |||
#line 3040 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 vsearch_bin_inclusive | =head2 vsearch_bin_inclusive | |||
=for sig | =for sig | |||
Signature: (vals(); x(n); indx [o]idx()) | Signature: (vals(); x(n); indx [o]idx()) | |||
=for ref | =for ref | |||
Determine the index for values in a sorted array of bins, lower bound inclusive. | Determine the index for values in a sorted array of bins, lower bound inclusive. | |||
skipping to change at line 2594 | skipping to change at line 2324 | |||
i = $x->nelem - 1 | i = $x->nelem - 1 | |||
If C<$x> contains duplicated elements, I<I> is the index of the | If C<$x> contains duplicated elements, I<I> is the index of the | |||
righmost (by index in array) duplicate if I<V> matches. | righmost (by index in array) duplicate if I<V> matches. | |||
=for bad | =for bad | |||
needs major (?) work to handles bad values | needs major (?) work to handles bad values | |||
=cut | =cut | |||
#line 3128 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*vsearch_bin_inclusive = \&PDL::vsearch_bin_inclusive; | *vsearch_bin_inclusive = \&PDL::vsearch_bin_inclusive; | |||
#line 3135 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 vsearch_bin_exclusive | =head2 vsearch_bin_exclusive | |||
=for sig | =for sig | |||
Signature: (vals(); x(n); indx [o]idx()) | Signature: (vals(); x(n); indx [o]idx()) | |||
=for ref | =for ref | |||
Determine the index for values in a sorted array of bins, lower bound exclusive. | Determine the index for values in a sorted array of bins, lower bound exclusive. | |||
skipping to change at line 2661 | skipping to change at line 2385 | |||
i = $x->nelem - 1 | i = $x->nelem - 1 | |||
If C<$x> contains duplicated elements, I<I> is the index of the | If C<$x> contains duplicated elements, I<I> is the index of the | |||
righmost (by index in array) duplicate if I<V> matches. | righmost (by index in array) duplicate if I<V> matches. | |||
=for bad | =for bad | |||
needs major (?) work to handles bad values | needs major (?) work to handles bad values | |||
=cut | =cut | |||
#line 3223 "Primitive.pm" | ||||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*vsearch_bin_exclusive = \&PDL::vsearch_bin_exclusive; | *vsearch_bin_exclusive = \&PDL::vsearch_bin_exclusive; | |||
#line 3230 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 interpolate | =head2 interpolate | |||
=for sig | =for sig | |||
Signature: (real xi(); real x(n); y(n); [o] yi(); int [o] err()) | Signature: (real xi(); real x(n); y(n); [o] yi(); int [o] err()) | |||
=for ref | =for ref | |||
routine for 1D linear interpolation | routine for 1D linear interpolation | |||
skipping to change at line 2710 | skipping to change at line 2428 | |||
is printed rather than returning an error ndarray. | is printed rather than returning an error ndarray. | |||
Note that C<interpolate> can use complex values for C<$y> and C<$yi> but | Note that C<interpolate> can use complex values for C<$y> and C<$yi> but | |||
C<$x> and C<$xi> must be real. | C<$x> and C<$xi> must be real. | |||
=for bad | =for bad | |||
needs major (?) work to handles bad values | needs major (?) work to handles bad values | |||
=cut | =cut | |||
#line 3281 "Primitive.pm" | ||||
#line 959 "../../blib/lib/PDL/PP.pm" | ||||
sub PDL::interpolate { | #line 2974 "primitive.pd" | |||
sub PDL::interpolate { | ||||
my ($xi, $x, $y, $yi, $err) = @_; | my ($xi, $x, $y, $yi, $err) = @_; | |||
croak "x must be real" if (ref($x) && ! $x->type->real); | croak "x must be real" if (ref($x) && ! $x->type->real); | |||
croak "xi must be real" if (ref($xi) && ! $xi->type->real ); | croak "xi must be real" if (ref($xi) && ! $xi->type->real ); | |||
$yi //= PDL->null; | $yi //= PDL->null; | |||
$err //= PDL->null; | $err //= PDL->null; | |||
PDL::_interpolate_int($xi, $x, $y, $yi, $err); | PDL::_interpolate_int($xi, $x, $y, $yi, $err); | |||
($yi, $err); | ($yi, $err); | |||
} | } | |||
#line 3296 "Primitive.pm" | #line 2815 "Primitive.pm" | |||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*interpolate = \&PDL::interpolate; | *interpolate = \&PDL::interpolate; | |||
#line 3303 "Primitive.pm" | ||||
#line 3046 "primitive.pd" | #line 3054 "primitive.pd" | |||
=head2 interpol | =head2 interpol | |||
=for sig | =for sig | |||
Signature: (xi(); x(n); y(n); [o] yi()) | Signature: (xi(); x(n); y(n); [o] yi()) | |||
=for ref | =for ref | |||
routine for 1D linear interpolation | routine for 1D linear interpolation | |||
skipping to change at line 2765 | skipping to change at line 2478 | |||
my $xi = shift; | my $xi = shift; | |||
my $x = shift; | my $x = shift; | |||
my $y = shift; | my $y = shift; | |||
my $yi = @_ == 1 ? $_[0] : PDL->null; | my $yi = @_ == 1 ? $_[0] : PDL->null; | |||
interpolate( $xi, $x, $y, $yi, my $err = PDL->null ); | interpolate( $xi, $x, $y, $yi, my $err = PDL->null ); | |||
print "some values had to be extrapolated\n" | print "some values had to be extrapolated\n" | |||
if any $err; | if any $err; | |||
return $yi if @_ == 0; | return $yi if @_ == 0; | |||
} # sub: interpol() | } # sub: interpol() | |||
*PDL::interpol = \&interpol; | *PDL::interpol = \&interpol; | |||
#line 3342 "Primitive.pm" | ||||
#line 3084 "primitive.pd" | ||||
#line 3092 "primitive.pd" | ||||
=head2 interpND | =head2 interpND | |||
=for ref | =for ref | |||
Interpolate values from an N-D ndarray, with switchable method | Interpolate values from an N-D ndarray, with switchable method | |||
=for example | =for example | |||
$source = 10*xvals(10,10) + yvals(10,10); | $source = 10*xvals(10,10) + yvals(10,10); | |||
$index = pdl([[2.2,3.5],[4.1,5.0]],[[6.0,7.4],[8,9]]); | $index = pdl([[2.2,3.5],[4.1,5.0]],[[6.0,7.4],[8,9]]); | |||
skipping to change at line 3009 | skipping to change at line 2720 | |||
$mag = $mag->dummy(-1,$index->dim($i)); | $mag = $mag->dummy(-1,$index->dim($i)); | |||
} | } | |||
my $out = cos($phase + $phref ) * $mag; | my $out = cos($phase + $phref ) * $mag; | |||
$out = $out->clump($source->ndims)->sumover; | $out = $out->clump($source->ndims)->sumover; | |||
return $out; | return $out; | |||
} else { | } else { | |||
barf("interpND: unknown method '$method'; valid ones are 'linear' and 'samp le'.\n"); | barf("interpND: unknown method '$method'; valid ones are 'linear' and 'samp le'.\n"); | |||
} | } | |||
} | } | |||
#line 3589 "Primitive.pm" | ||||
#line 3334 "primitive.pd" | ||||
#line 3341 "primitive.pd" | ||||
=head2 one2nd | =head2 one2nd | |||
=for ref | =for ref | |||
Converts a one dimensional index ndarray to a set of ND coordinates | Converts a one dimensional index ndarray to a set of ND coordinates | |||
=for usage | =for usage | |||
@coords=one2nd($x, $indices) | @coords=one2nd($x, $indices) | |||
skipping to change at line 3059 | skipping to change at line 2768 | |||
my @dimension=$x->dims; | my @dimension=$x->dims; | |||
$ind = indx($ind); | $ind = indx($ind); | |||
my(@index); | my(@index); | |||
my $count=0; | my $count=0; | |||
foreach (@dimension) { | foreach (@dimension) { | |||
$index[$count++]=$ind % $_; | $index[$count++]=$ind % $_; | |||
$ind /= $_; | $ind /= $_; | |||
} | } | |||
return @index; | return @index; | |||
} | } | |||
#line 3641 "Primitive.pm" | #line 3148 "Primitive.pm" | |||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 which | =head2 which | |||
=for sig | =for sig | |||
Signature: (mask(n); indx [o] inds(n); indx [o]lastout()) | Signature: (mask(n); indx [o] inds(n); indx [o]lastout()) | |||
=for ref | =for ref | |||
Returns indices of non-zero values from a 1-D PDL | Returns indices of non-zero values from a 1-D PDL | |||
skipping to change at line 3117 | skipping to change at line 2824 | |||
[0 1 2 3 4 5 6 7 8 9] | [0 1 2 3 4 5 6 7 8 9] | |||
pdl> $indx = which($x>6); p $indx | pdl> $indx = which($x>6); p $indx | |||
[7 8 9] | [7 8 9] | |||
=for bad | =for bad | |||
which processes bad values. | which processes bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 3707 "Primitive.pm" | ||||
#line 959 "../../blib/lib/PDL/PP.pm" | ||||
#line 3472 "primitive.pd" | ||||
sub which { my ($this,$out) = @_; | sub which { my ($this,$out) = @_; | |||
$this = $this->flat; | $this = $this->flat; | |||
$out //= $this->nullcreate; | $out //= $this->nullcreate; | |||
PDL::_which_int($this,$out,my $lastout = $this->nullcreate); | PDL::_which_int($this,$out,my $lastout = $this->nullcreate); | |||
my $lastoutmax = $lastout->max->sclr; | my $lastoutmax = $lastout->max->sclr; | |||
$lastoutmax ? $out->slice('0:'.($lastoutmax-1))->sever : empty(in dx); | $lastoutmax ? $out->slice('0:'.($lastoutmax-1))->sever : empty(in dx); | |||
} | } | |||
*PDL::which = \&which; | *PDL::which = \&which; | |||
#line 3721 "Primitive.pm" | #line 3218 "Primitive.pm" | |||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*which = \&PDL::which; | *which = \&PDL::which; | |||
#line 3728 "Primitive.pm" | ||||
#line 958 "../../blib/lib/PDL/PP.pm" | ||||
=head2 which_both | =head2 which_both | |||
=for sig | =for sig | |||
Signature: (mask(n); indx [o] inds(n); indx [o]notinds(n); indx [o]lastout(); indx [o]lastoutn()) | Signature: (mask(n); indx [o] inds(n); indx [o]notinds(n); indx [o]lastout(); indx [o]lastoutn()) | |||
=for ref | =for ref | |||
Returns indices of nonzero and zero values in a mask PDL | Returns indices of nonzero and zero values in a mask PDL | |||
skipping to change at line 3169 | skipping to change at line 2869 | |||
pdl> ($big, $small) = which_both($x >= 5); p "$big\n$small" | pdl> ($big, $small) = which_both($x >= 5); p "$big\n$small" | |||
[5 6 7 8 9] | [5 6 7 8 9] | |||
[0 1 2 3 4] | [0 1 2 3 4] | |||
=for bad | =for bad | |||
which_both processes bad values. | which_both processes bad values. | |||
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. | |||
=cut | =cut | |||
#line 3771 "Primitive.pm" | ||||
#line 959 "../../blib/lib/PDL/PP.pm" | ||||
#line 3489 "primitive.pd" | ||||
sub which_both { my ($this,$outi,$outni) = @_; | sub which_both { my ($this,$outi,$outni) = @_; | |||
$this = $this->flat; | $this = $this->flat; | |||
$outi //= $this->nullcreate; | $outi //= $this->nullcreate; | |||
$outni //= $this->nullcreate; | $outni //= $this->nullcreate; | |||
PDL::_which_both_int($this,$outi,$outni,my $lastout = $this->null create,my $lastoutn = $this->nullcreate); | PDL::_which_both_int($this,$outi,$outni,my $lastout = $this->null create,my $lastoutn = $this->nullcreate); | |||
my $lastoutmax = $lastout->max->sclr; | my $lastoutmax = $lastout->max->sclr; | |||
$outi = $lastoutmax ? $outi->slice('0:'.($lastoutmax-1))->sever : empty(indx); | $outi = $lastoutmax ? $outi->slice('0:'.($lastoutmax-1))->sever : empty(indx); | |||
return $outi if !wantarray; | return $outi if !wantarray; | |||
my $lastoutnmax = $lastoutn->max->sclr; | my $lastoutnmax = $lastoutn->max->sclr; | |||
($outi, $lastoutnmax ? $outni->slice('0:'.($lastoutnmax-1))->seve r : empty(indx)); | ($outi, $lastoutnmax ? $outni->slice('0:'.($lastoutnmax-1))->seve r : empty(indx)); | |||
} | } | |||
*PDL::which_both = \&which_both; | *PDL::which_both = \&which_both; | |||
#line 3789 "Primitive.pm" | #line 3276 "Primitive.pm" | |||
#line 960 "../../blib/lib/PDL/PP.pm" | ||||
*which_both = \&PDL::which_both; | *which_both = \&PDL::which_both; | |||
#line 3796 "Primitive.pm" | ||||
#line 3515 "primitive.pd" | #line 3522 "primitive.pd" | |||
=head2 where | =head2 where | |||
=for ref | =for ref | |||
Use a mask to select values from one or more data PDLs | Use a mask to select values from one or more data PDLs | |||
C<where> accepts one or more data ndarrays and a mask ndarray. It | C<where> accepts one or more data ndarrays and a mask ndarray. It | |||
returns a list of output ndarrays, corresponding to the input data | returns a list of output ndarrays, corresponding to the input data | |||
ndarrays. Each output ndarray is a 1-dimensional list of values in its | ndarrays. Each output ndarray is a 1-dimensional list of values in its | |||
skipping to change at line 3257 | skipping to change at line 2952 | |||
if($_[-1]->getndims > 1) { | if($_[-1]->getndims > 1) { | |||
my $mask = $_[-1]->clump(-1)->which; | my $mask = $_[-1]->clump(-1)->which; | |||
return map {$_->clump(-1)->index($mask)} @_[0..$#_-1]; | return map {$_->clump(-1)->index($mask)} @_[0..$#_-1]; | |||
} else { | } else { | |||
my $mask = $_[-1]->which; | my $mask = $_[-1]->which; | |||
return map {$_->index($mask)} @_[0..$#_-1]; | return map {$_->index($mask)} @_[0..$#_-1]; | |||
} | } | |||
} | } | |||
} | } | |||
*where = \&PDL::where; | *where = \&PDL::where; | |||
#line 3865 "Primitive.pm" | ||||
#line 3583 "primitive.pd" | ||||
#line 3590 "primitive.pd" | ||||
=head2 where_both | =head2 where_both | |||
=for ref | =for ref | |||
Returns slices (non-zero in mask, zero) of an ndarray according to a mask | Returns slices (non-zero in mask, zero) of an ndarray according to a mask | |||
=for usage | =for usage | |||
($match_vals, $non_match_vals) = where_both($pdl, $mask); | ($match_vals, $non_match_vals) = where_both($pdl, $mask); | |||
skipping to change at line 3295 | skipping to change at line 2988 | |||
=cut | =cut | |||
sub PDL::where_both { | sub PDL::where_both { | |||
barf "Usage: where_both(\$pdl, \$mask)\n" if @_ != 2; | barf "Usage: where_both(\$pdl, \$mask)\n" if @_ != 2; | |||
my ($arr, $mask) = @_; # $mask has 0==false, 1==true | my ($arr, $mask) = @_; # $mask has 0==false, 1==true | |||
my $arr_flat = $arr->clump(-1); | my $arr_flat = $arr->clump(-1); | |||
map $arr_flat->index1d($_), PDL::which_both($mask); | map $arr_flat->index1d($_), PDL::which_both($mask); | |||
} | } | |||
*where_both = \&PDL::where_both; | *where_both = \&PDL::where_both; | |||
#line 3905 "Primitive.pm" | ||||
#line 3621 "primitive.pd" | ||||
#line 3628 "primitive.pd" | ||||
=head2 whereND | =head2 whereND | |||
=for ref | =for ref | |||
C<where> with support for ND masks and broadcasting | C<where> with support for ND masks and broadcasting | |||
C<whereND> accepts one or more data ndarrays and a | C<whereND> accepts one or more data ndarrays and a | |||
mask ndarray. It returns a list of output ndarrays, | mask ndarray. It returns a list of output ndarrays, | |||
corresponding to the input data ndarrays. The values | corresponding to the input data ndarrays. The values | |||
are drawn from locations where the mask is nonzero. | are drawn from locations where the mask is nonzero. | |||
skipping to change at line 3358 | skipping to change at line 3049 | |||
L</whichND> returns N-D indices into a multidimensional PDL, from a mask. | L</whichND> returns N-D indices into a multidimensional PDL, from a mask. | |||
=cut | =cut | |||
sub PDL::whereND :lvalue { | sub PDL::whereND :lvalue { | |||
barf "Usage: whereND( \$pdl1, ..., \$pdlN, \$mask )\n" if @_ == 1; | barf "Usage: whereND( \$pdl1, ..., \$pdlN, \$mask )\n" if @_ == 1; | |||
my $mask = pop @_; # $mask has 0==false, 1==true | my $mask = pop @_; # $mask has 0==false, 1==true | |||
my @to_return; | my @to_return; | |||
my $n = PDL::sum($mask); | my $n = PDL::sum($mask); | |||
my $maskndims = $mask->ndims; | ||||
foreach my $arr (@_) { | foreach my $arr (@_) { | |||
my $sub_i = $mask * ones($arr); | ||||
my $where_sub_i = PDL::where($arr, $sub_i); | ||||
# count the number of dims in $mask and $arr | # count the number of dims in $mask and $arr | |||
# $mask = a b c d e f..... | # $mask = a b c d e f..... | |||
my @idims = dims($arr); | my @idims = dims($arr); | |||
# ...and pop off the number of dims in $mask | splice @idims, 0, $maskndims; # pop off the number of dims in $mask | |||
foreach ( dims($mask) ) { shift(@idims) }; | if (!$n or $arr->isempty) { | |||
push @to_return, PDL->zeroes($arr->type, $n, @idims); | ||||
next; | ||||
} | ||||
my $sub_i = $mask * ones($arr); | ||||
my $where_sub_i = PDL::where($arr, $sub_i); | ||||
my $ndim = 0; | my $ndim = 0; | |||
foreach my $id ($n, @idims[0..($#idims-1)]) { | foreach my $id ($n, @idims[0..($#idims-1)]) { | |||
$where_sub_i = $where_sub_i->splitdim($ndim++,$id) if $n>0; | $where_sub_i = $where_sub_i->splitdim($ndim++,$id) if $n>0; | |||
} | } | |||
push @to_return, $where_sub_i; | push @to_return, $where_sub_i; | |||
} | } | |||
return (@to_return == 1) ? $to_return[0] : @to_return; | return (@to_return == 1) ? $to_return[0] : @to_return; | |||
} | } | |||
*whereND = \&PDL::whereND; | *whereND = \&PDL::whereND; | |||
#line 3987 "Primitive.pm" | ||||
#line 3702 "primitive.pd" | ||||
#line 3713 "primitive.pd" | ||||
=head2 whichND | =head2 whichND | |||
=for ref | =for ref | |||
Return the coordinates of non-zero values in a mask. | Return the coordinates of non-zero values in a mask. | |||
=for usage | =for usage | |||
WhichND returns the N-dimensional coordinates of each nonzero value in | WhichND returns the N-dimensional coordinates of each nonzero value in | |||
a mask PDL with any number of dimensions. The returned values arrive | a mask PDL with any number of dimensions. The returned values arrive | |||
skipping to change at line 3480 | skipping to change at line 3173 | |||
} | } | |||
for my $i (0..$#mdims) { | for my $i (0..$#mdims) { | |||
my($s) = $ind->index($i); | my($s) = $ind->index($i); | |||
$s /= $mult->index($i); | $s /= $mult->index($i); | |||
$s %= $mdims[$i]; | $s %= $mdims[$i]; | |||
} | } | |||
return $ind; | return $ind; | |||
} | } | |||
#line 4094 "Primitive.pm" | ||||
#line 3811 "primitive.pd" | ||||
#line 3822 "primitive.pd" | ||||
=head2 setops | =head2 setops | |||
=for ref | =for ref | |||
Implements simple set operations like union and intersection | Implements simple set operations like union and intersection | |||
=for usage | =for usage | |||
Usage: $set = setops($x, <OPERATOR>, $y); | Usage: $set = setops($x, <OPERATOR>, $y); | |||
skipping to change at line 3662 | skipping to change at line 3353 | |||
return $y if $y->isempty; | return $y if $y->isempty; | |||
# Make ordered list of set union. | # Make ordered list of set union. | |||
my $union = append($x, $y)->qsort; | my $union = append($x, $y)->qsort; | |||
return $union->where($union == rotate($union, -1))->uniq; | return $union->where($union == rotate($union, -1))->uniq; | |||
} else { | } else { | |||
print "The operation $op is not known!"; | print "The operation $op is not known!"; | |||
return -1; | return -1; | |||
} | } | |||
} | } | |||
#line 4279 "Primitive.pm" | ||||
#line 3994 "primitive.pd" | ||||
#line 4005 "primitive.pd" | ||||
=head2 intersect | =head2 intersect | |||
=for ref | =for ref | |||
Calculate the intersection of two ndarrays | Calculate the intersection of two ndarrays | |||
=for usage | =for usage | |||
Usage: $set = intersect($x, $y); | Usage: $set = intersect($x, $y); | |||
skipping to change at line 3699 | skipping to change at line 3388 | |||
=cut | =cut | |||
*intersect = \&PDL::intersect; | *intersect = \&PDL::intersect; | |||
sub PDL::intersect { | sub PDL::intersect { | |||
return setops($_[0], 'AND', $_[1]); | return setops($_[0], 'AND', $_[1]); | |||
} | } | |||
#line 4318 "Primitive.pm" | ||||
#line 4030 "primitive.pd" | ||||
#line 4041 "primitive.pd" | ||||
=head1 AUTHOR | =head1 AUTHOR | |||
Copyright (C) Tuomas J. Lukka 1997 (lukka@husc.harvard.edu). Contributions | Copyright (C) Tuomas J. Lukka 1997 (lukka@husc.harvard.edu). Contributions | |||
by Christian Soeller (c.soeller@auckland.ac.nz), Karl Glazebrook | by Christian Soeller (c.soeller@auckland.ac.nz), Karl Glazebrook | |||
(kgb@aaoepp.aao.gov.au), Craig DeForest (deforest@boulder.swri.edu) | (kgb@aaoepp.aao.gov.au), Craig DeForest (deforest@boulder.swri.edu) | |||
and Jarle Brinchmann (jarle@astro.up.pt) | and Jarle Brinchmann (jarle@astro.up.pt) | |||
All rights reserved. There is no warranty. You are allowed | All rights reserved. There is no warranty. You are allowed | |||
to redistribute this software / documentation under certain | to redistribute this software / documentation under certain | |||
conditions. For details, see the file COPYING in the PDL | conditions. For details, see the file COPYING in the PDL | |||
distribution. If this file is separated from the PDL distribution, | distribution. If this file is separated from the PDL distribution, | |||
the copyright notice should be included in the file. | the copyright notice should be included in the file. | |||
Updated for CPAN viewing compatibility by David Mertens. | Updated for CPAN viewing compatibility by David Mertens. | |||
=cut | =cut | |||
#line 4342 "Primitive.pm" | #line 3802 "Primitive.pm" | |||
# Exit with OK status | # Exit with OK status | |||
1; | 1; | |||
End of changes. 177 change blocks. | ||||
399 lines changed or deleted | 86 lines changed or added |