etendre scipy.ndimage avec une fonction C
Bonjour,
J'essaie d'utiliser geometric_transform de scipy.ndimage avec une fonction de mapping écrite en C pour accélerer le code.
J'essaie avec l'example du tuto ( " Extending ndimage in C" (http://docs.scipy.org/doc/scipy/refe...age-ccallbacks) mais celui ci ne semble pas être correct (pb de compilation).
##############################################
static int
_shift_function(int *output_coordinates, double* input_coordinates,
int output_rank, int input_rank, void *callback_data)
{
int ii;
/* get the shift from the callback data pointer: */
double shift = *(double*)callback_data;
/* calculate the coordinates: */
for(ii = 0; ii < irank; ii++)
icoor[ii] = ocoor[ii] - shift;
/* return OK status: */
return 1;
}
##############################################
gcc example.c --shared -lpython -o example.so
Compile error :
example.c: In function ?_shift_function?:
example.c:12: error: ?irank? undeclared (first use in this function)
example.c:12: error: (Each undeclared identifier is reported only once
example.c:12: error: for each function it appears in.)
example.c:13: error: ?icoor? undeclared (first use in this function)
example.c:13: error: ?ocoor? undeclared (first use in this function)
*************************************************************
Je modifie le code pour que la compilation passe :
##############################################
static int
_shift_function(int *output_coordinates, double* input_coordinates,
int output_rank, int input_rank, void *callback_data)
{
int ii;
/* get the shift from the callback data pointer: */
double shift = *(double*)callback_data;
/* calculate the coordinates: */
for(ii = 0; ii < input_rank; ii++)
input_coordinates[ii] = output_coordinates[ii] - shift;
/* return OK status: */
return 1;
}
##############################################
Mais le résultat attendu n'est pas correct.
##############################################
a = np.arange(12.).reshape((4, 3))
fnc= example.shift_function(0.5)
print ndimage.geometric_transform(a, fnc)
array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]])
au lieu de :
[[ 0. 0. 0. ]
[ 0. 1.3625 2.7375]
[ 0. 4.8125 6.1875]
[ 0. 8.2625 9.6375]]
##############################################
Une idée du problème...?
Merci d'avance
Eric