错误无法从'void *'转换为'float *'`

时间:2014-07-23 20:46:39

标签: c++ matlab mex

我写了一个c ++函数及其相关的mex。但是c ++函数的一种输入是double *

  1. 函数pointwise_search的输出是一个指针。我被告知我应该删除它。但我不知道应该删除它,因为我需要它作为输出。

  2. 从答案中,我知道我应该通过mxIsSingle检查输入的类型。所以我更正了函数mexFunction。但是有一个错误error C2440: '=' : cannot convert from 'void *' to 'float *'

  3. 在matlab中,我应该调用pointwise_search( float * p , float q , num_thres, float n , len )。如果我在matlab中有一个向量v_in_matlab = rand(5,1)。我应该通过p=single(v_in_matlab);然后pointwise_search(p...

  4. 获取指针

    提前致谢。

    #include "mex.h"
    #include <iostream>
    #include <algorithm>
    #include <functional>
    #include <vector>
    
    using namespace std;
    
    
    float * pointwise_search(float *p,float *q,int num_thres, float* n, int len )
    {
        vector<float> P(p, p + num_thres);
        vector<float> Q(q, q + num_thres);
        int size_of_threshold = P.size();
        float  *Y=new float[len];
        float *z=new float[len];
        typedef vector<float > ::iterator IntVectorIt ;
        IntVectorIt start, end, it, location ;
        start = P.begin() ;   // location of first
        // element of Numbers
    
        end = P.end() ;       // one past the location
        // last element of Numbers
    
        for (int i=0;i<len;i++)
        {
            location=lower_bound(start, end, n[i]) ;
            z[i]=location - start;
            if(z[i]>0&&z[i]<size_of_threshold)
            {
    
                Y[i]=(n[i]-P[z[i]])/(P[z[i]-1]-P[z[i]])*(Q[z[i]-1]-Q[z[i]])+Q[z[i]];
            }
            else
            {
                Y[i]=Q[z[i]];
            }
        }
    
        return (&Y[0]);
    }
    
    
    
    
     void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
       {
        float * Numbers, *Q;
        if (nrhs != 5)
        {
            mexErrMsgTxt("Input is wrong!");
        }
        float *n = (float*) mxGetData(prhs[3]);
        int len = (int) mxGetScalar(prhs[4]);
        int num_thres = (int) mxGetScalar(prhs[2]);
    
        /* Input gs */
    
        if(mxIsComplex(prhs[0])
        ||!mxIsSingle(prhs[0]))
            mexErrMsgTxt("Input 0 should be a class Single");
        /* get the pointer to gs */
        Numbers=mxGetData(prhs[0]);
    
    
        if(mxIsComplex(prhs[0])
        ||!mxIsSingle(prhs[0]))
            mexErrMsgTxt("Input 0 should be a class Single");
        /* get the pointer to gs */
        Q=mxGetData(prhs[1]);
    
    //     float * Numbers= (float *)mxGetData(prhs[0]);
    //     float * Q= (float *)mxGetData(prhs[1]);
    
        float * out= pointwise_search(Numbers,Q,num_thres,n,len );
        //float* resizedDims = (float*)mxGetPr(out);
    }
    

2 个答案:

答案 0 :(得分:1)

在Matlab中使用single()在调用mexFunction之前转换数据。在C ++端,通过mxIsSingle()验证该类型确实是单一的。在此之后,您可以愉快地投射到float*

答案 1 :(得分:1)

在您担心MEX代码之前,请先看看您的C ++函数。您有一些非常明显的memory leaksnew但没有delete[])。

关于MEX,你永远不应该看到这个:

(float *)mxGetPr(prhs[0])

您无法将double*投射到float*并期望数字有任何意义。从MATLAB输入single并使用:

(float *)mxGetData(prhs[0])

并按照Trilarion的建议并测试所有输入mxArray的预期数据类型。