[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: histogram crashes



Hi Bob,
I posted a bug report to RSI late last year about problems with
histogram and NaNs. I also posted a copy of it to this newsgroup.
However, the problem I came across didn't crash IDL, just gave me
incorrect results.
They acknowledged it was a bug introduced when the NaN keyword
was implemented (IDL 5.0?). They said it would be fixed in IDL 5.4
and I believe it has been.
Anyway, here is my original post for your reference.
Cheers, Paul

Original Post
Bug: HISTOGRAM with reverse indices AND NaN - 23 Dec 1999
Hi All,
I just submitted this as a bug report to RSI.
I use IDL 5.3 (and 5.2) on a windows NT 4 SP5 platform.
I have been using the histogram procedure with reverse_indices to
perform bin averaging for quite a few years now.
Recently I had some data with NaN's in it so I implemented the NaN
keyword. I started getting screwy results. If there were a large
number of NaN's my averaging routine would fall over due to an
incorrect indice in the reverse_indice itself (see below).
Anyway thought you might be interested in this!
Cheers Paul

----------------------------------------------------

I am running IDL 5.3 on the platform mentioned above.
I have discovered what I think is a bug in the histogram function.
It occurs when using the reverse_indices keyword AND the NaN keyword.
The reverse indices that are returned are incorrect if there is
missing data (NaN).
The procedure below should demonstrate this. I also tested this on an
SGI running IRIX 6.5 and IDL 5.2.

; ++
pro hist_ri_fail
;
; ++++
; quick procedure to demonstrate where the
; histogram reverse indices fail when data
; contains NaNs. Counter not incremented
; correctly?.
;
;  PBK 23 Dec 1999.
;
; ++++
; make an array
a=findgen(100)
;
; Set every 3rd point to NaN
a[where(a mod 3 eq 0.)]=!values.f_nan
;
print,'a:',a
;
; do the histogram and return reverse indices.
count_mid=histogram(a, binsize=10, reverse_indices=r, $
                    min=0., max=99., /NaN)
;
; ++++
; find number of Nan's and print some values
zz=where(finite(a,/nan), cnt_nan)
print,'cnt nan:',cnt_nan
print,'cnt mid:',count_mid
print,'n rev ind:',n_elements(r)
print,'rev ind:',r
;
; ++++
end
; ++

a:        NaN      1.00000    2.00000      NaN    4.00000
    5.00000        NaN    7.00000    8.00000        NaN    10.0000
    11.0000        NaN    13.0000    14.0000        NaN    16.0000
    17.0000        NaN    19.0000    20.0000        NaN    22.0000
    23.0000        NaN    25.0000    26.0000        NaN    28.0000
    29.0000        NaN    31.0000    32.0000        NaN    34.0000
    35.0000        NaN    37.0000    38.0000        NaN    40.0000
    41.0000        NaN    43.0000    44.0000        NaN    46.0000
    47.0000        NaN    49.0000    50.0000        NaN    52.0000
    53.0000        NaN    55.0000    56.0000        NaN    58.0000
    59.0000        NaN    61.0000    62.0000        NaN    64.0000
    65.0000        NaN    67.0000    68.0000        NaN    70.0000
    71.0000        NaN    73.0000    74.0000        NaN    76.0000
    77.0000        NaN    79.0000    80.0000        NaN    82.0000
    83.0000        NaN    85.0000    86.0000        NaN    88.0000
    89.0000        NaN    91.0000    92.0000        NaN    94.0000
    95.0000        NaN    97.0000    98.0000        NaN
cnt nan:          34
cnt mid:           6           7           7           6           7
           7           6           7           7           6
n rev ind:          77
rev ind:          11          51          24          31          37
          44          51          57          64          71          77
           0           1           2           3           4           5
          10          11          13          14          16          17
          19          21          24          27          30          33
          36          39          42          45          48          51
          54          57          60          63          66          69
          72          75          78          81          84          87
          90          93          96          99          61          62
          64          65          67          68          70          71
          73          74          76          77          79          80
          82          83          85          86          88          89
          91          92          94          95          97          98

>From the output you will see that the reverse indices are not correct
and quite screwy!
The second number of the reverse indices should be 17 not 51 (17+34),
so the count of the number of NaN's has been added to this second
indice. The rest of the pointer numbers (first 11 elements of r for
this case) look fine. The first 6 actual indices (r[11:16]) are wrong,
it appears to be just 0 to 5!
The next 7 indices (r[17:23]) are correct!
Then, most of the NaN indices are listed (r[24:50], 50=24+34-7-1).
The rest of the indices are correct.
There is no way to recover all the correct indices from this.
The output from histogram itself (count_mid in the example) appears to
be fine. The toal number of reverse indices (77) is also correct, but
as shown above the indices themselves are incorrect.

Cheers Paul



In article <UbBQ5.198$sD6.190493@den-news1.rmi.net>,
  "R.G.S." <rgs1967@hotmail.com> wrote:
> Greetings all,
>
> I have a situation where histogram is crashing on me, in what seems
to be
> a strange manner. (IDL 5.3.1, on WinNT 4 Workstation SP 5)
>
> Here is info on my data (latitudes):
> LAT             FLOAT     = Array[76, 1624]
> IDL> help,lat(*)
> <Expression>    FLOAT     = Array[123424]
>
> range of latitudes:      -65.8900      79.9300
> min = :       20.0000
> There are NAN values in the array.
>
> Here is the offending call to histogram:
> hlat = histogram(lat(*),binsize = float(deltalat), min
> =float(20),REVERSE_INDICES = R,/nan)
>
> This results in a Norton CrashGuard message and IDL closes.
>
> Of course,the following call to histogram works with no problems:
> hlat = histogram(lat(*),binsize = long(deltalat), min =float(-1),/nan)
> as does:
> hlat = histogram(lat(*),binsize = float(deltalat), min =float
(20),/nan)
>
> The difference seems to be that a positive "min" crashes and a
negative
> "min" is ok when
> the reverse_index keyword is called. For my purposes the
reverse_indices
> keyword
> is required.
>
> Anyone run across this before, and are there any fixes?
>
> Cheers,
> bob stockwell
> stockwell (at) co-ra.com
>
>


Sent via Deja.com http://www.deja.com/
Before you buy.