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]);
    }
}
示例#2
0
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);*/
}