void distance_matrix(const double*X, const double*Y, const double*g, int m, int n, int d, double* dist) { int i; squared_distance_matrix(X, Y, g, m, n, d, dist); for (i=0;i<m*n;++i){ dist[i] = sqrt(dist[i]); } }
static PyObject * py_squared_distance_matrix(PyObject *self, PyObject *args) { int m,n,d; double *dist; PyObject *A, *B, *g; PyArrayObject *arrayA, *arrayB, *arrayg; PyArrayObject *array_dist; /* double scale, result; PyObject *list; */ int out_dim[2]; /* send Python arrays to C */ if (!PyArg_ParseTuple(args, "OOO", &A, &B, &g)) { return NULL; } /* printf("getting input success. \n"); */ arrayA = (PyArrayObject *) PyArray_ContiguousFromObject(A, PyArray_DOUBLE, 1, 2); arrayB = (PyArrayObject *) PyArray_ContiguousFromObject(B, PyArray_DOUBLE, 1, 2); arrayg = (PyArrayObject *) PyArray_ContiguousFromObject(g, PyArray_DOUBLE, 1, 2); /* printf("converting success!\n"); */ if (arrayA->nd > 2 || arrayA->descr->type_num != PyArray_DOUBLE) { PyErr_SetString(PyExc_ValueError, "array must be two-dimensional and of type float"); return NULL; } /*printf("checking input success!\n");*/ m = (arrayA->dimensions)[0]; n = (arrayB->dimensions)[0]; if (arrayA->nd>1) d = (arrayA->dimensions)[1]; else d = 1; /* printf("m=%d,n=%d,d=%d\n",m,n,d); */ dist = (double *) malloc(m*n*sizeof(double)); /* call function */ squared_distance_matrix((double*)(arrayA->data), (double*)(arrayB->data), (double*)(arrayg->data), m, n, d, dist); out_dim[0] = m; out_dim[1] = n; /* PyArray_FromDimsAndData() deprecated, use PyArray_SimpleNewFromData() http://blog.enthought.com/?p=62 array_dist = (PyArrayObject*) PyArray_FromDimsAndData(2,out_dim,PyArray_DOUBLE, (char*)dist); */ array_dist = PyArray_SimpleNewFromData(2,out_dim,NPY_DOUBLE,dist); if (array_dist == NULL){ printf("creating %dx%d array failed\n", out_dim[0],out_dim[1]); return NULL; } /*free(dist);*/ /* send the result back to Python */ Py_DECREF(arrayA); Py_DECREF(arrayB); Py_DECREF(arrayg); return PyArray_Return(array_dist); //return PyFloat_FromDouble(result); /*return Py_BuildValue("d", result);*/ }