OK, thank you for your explanations. I'm not sure if all of this makes sense. If you try
print $s > 5; in the above example, you will get 'BAD'. 5 is just a scalar and not a bad value. And $s is a one-dimensional piddle with a value different from the bad value. Neither of the values in this conditional expression is bad. Why does it return a string 'BAD'? Marek On Tue, 16 Jun 2015 at 14:24 Chris Marshall <devel.chm...@gmail.com> wrote: > This result seems to violate the principle of least surprise. > On the LHS we have a PDL with badvalue(0) and on the RHS we > have a perl scalar with value 0 (which happens to be the bad > value for the PDL). > > It seems surprising that $pdl > 0 is actually $pdl > pdl(0)->badvalue(0) > > Thoughts? > Chris > > > -------- Forwarded Message -------- Subject: Re: [Pdl-general] Weird > behaviour of stats with bad values Date: Tue, 16 Jun 2015 09:18:29 -0400 > From: > Chris Marshall <devel.chm...@gmail.com> <devel.chm...@gmail.com> To: Derek > Lamb <de...@boulder.swri.edu> <de...@boulder.swri.edu>, Marek Gierliński > <marek.gierlin...@gmail.com> <marek.gierlin...@gmail.com> CC: > pdl-gene...@lists.sourceforge.net > > > I think the problem is that if $s is a badvalue piddle with the > badvalue=0 > then $s>0 is $s>BAD which is BAD. If you use a value for badvalue that is > not in the comparison, you should be good. > > --Chris > > On 6/16/2015 09:11, Derek Lamb wrote: > > Thanks for the simple example. That helps a lot. > > The actual problem is that piddles with the badflags set always evaluate > to BAD when element-wise logical operations are performed on them. > > "print $s<0" prints BAD instead of 0 or 1. "print $x>0" also prints > [BAD BAD BAD BAD]. > > $m and $s have their badflags set (as they should, since they were made > from partially-bad data). You can check if they can be safely cleared, and > clear them if so, with $s->check_badflag, etc. Since $m and $s are > 1-element piddles, you can also just set them directly to their scalar > values, for example > > map{$_=$_->sclr} ($m,$s)=stats($x); #if you know they are only going to > be 1 element piddles > OR > map{$_=$_->((0))} ($m,$s)=stats($x); #if you just want the first value > > The fact that $m and $s are 1-element piddles is likely what is causing > your problem. My guess is that this behavior has changed (perhaps > intentionally, perhaps not) between your old version and more recent > versions, and if you were getting $m and $s as simple perl scalars before > you would not have seen this problem. I can verify that stats() has > returned 1-piddles and not perl scalars at least as far back as PDL-2.4.11. > > cheers, > Derek > > On Jun 16, 2015, at 6:29 AM, Marek Gierliński < > marek.gierlin...@gmail.com> wrote: > > Oops, sorry, I missed a line when copying the text. Here is the code > again. > > use PDL; > use PDL::NiceSlice; > > > my $x = pdl(1, 2, 3, 0); > $x->badflag(1); > $x->badvalue(0); > > print "x = $x\n"; > > my ($m, $s) = stats($x); > > print "m = $m, s = $s\n"; > print "s greater than zero\n" if $s > 0; > print "s less than zero\n" if $s < 0; > print "s equals zero\n" if $s == 0; > > > On Tue, 16 Jun 2015 at 12:20 Chris Marshall <devel.chm...@gmail.com> > wrote: > >> Hi Marek- >> >> Do you have a complete example showing the problem? >> You don't show where $m and $s are being set below. >> >> Thanks, >> Chris >> >> >> On 6/16/2015 07:04, Marek Gierliński wrote: >> >> I have recently encountered a weird problem with stats (or statsover) >> using bad values. The resulting numbers have a strange property, they >> always return true in comparisons. This code: >> >> use PDL; >> use PDL::NiceSlice; >> >> my $x = pdl(1, 2, 3, 0); >> $x->badflag(1); $x->badvalue(0); >> >> print "m = $m, s = $s\n"; >> print "s greater than zero\n" if $s > 0; >> print "s less than zero\n" if $s < 0; >> print "s equals zero\n" if $s == 0; >> >> returns the following output: >> >> x = [1 2 3 BAD] >> m = 2, s = 1 >> s greater than zero >> s less than zero >> s equals zero >> >> which doesn't make any sense. Can anyone explain this? I always assumed >> that 'stats' returned ordinary Perl scalars, but this must be something >> different. >> >> I'm using PDL version 2.007. We had an older version installed for a >> long time and I think this problem appeared when we upgraded to 2.007. >> >> Marek >> >> > ------------------------------------------------------------------------------ > _______________________________________________ > pdl-devel mailing list > pdl-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/pdl-devel >
------------------------------------------------------------------------------
_______________________________________________ pdl-devel mailing list pdl-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/pdl-devel