I made a first attempt to cython wrap Richard's double heap moving
median C code.
It runs but it gives the wrong output (see below). Any ideas what
could be causing the problem?
I made some changes to Richard's code as you can see here:
https://github.com/kwgoodman/roly/commit/2c5df3a16e5af3df38151a8b4e7c...
I changed the array values from int to double. And instead of
supplying a next_value() function that gives the next value of the
array to the double heap initialization, I passed in a pointer to the
first array element.
Here's the output I get:
>> import roly
>> a = np.arange(10).astype('float64')
>> a
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
>> roly.slow.move_median(a, 3)
array([ nan, nan, 1., 2., 3., 4., 5., 6., 7., 8.])
>> roly.linkedlist.move_median(a, 3)
array([ nan, nan, 1., 2., 3., 4., 5., 6., 7., 8.])
>> roly.doubleheap.move_median(a, 3)
array([ nan, nan, 4., 4., 4., 5., 5., 6., 6., 6.])
Here are the results for some other window values in case they mean anything:
>> roly.doubleheap.move_median(a, 2)
array([ nan, 4., 4., 4., 4., 5., 5., 6., 6., 6.])
>> roly.doubleheap.move_median(a, 3)
array([ nan, nan, 4., 4., 4., 5., 5., 6., 6., 6.])
>> roly.doubleheap.move_median(a, 4)
array([ nan, nan, nan, 4., 4., 5., 5., 5., 6., 7.])
>> roly.doubleheap.move_median(a, 5)
array([ nan, nan, nan, nan, 4., 5., 5., 6., 6., 7.])
>> roly.doubleheap.move_median(a, 6)
array([ nan, nan, nan, nan, nan, 4., 4., 4., 6., 7.])
>> roly.doubleheap.move_median(a, 7)
array([ nan, nan, nan, nan, nan, nan, 4., 4., 4., 7.])
>> roly.doubleheap.move_median(a, 8)
array([ nan, nan, nan, nan, nan, nan, nan, 4., 4., 4.])
>> roly.doubleheap.move_median(a, 9)
array([ nan, nan, nan, nan, nan, nan, nan, nan, 4., 4.])
>> roly.doubleheap.move_median(a, 10)
array([ nan, nan, nan, nan, nan, nan, nan, nan, nan, 4.])