我写了一个c ++函数及其相关的mex。但是c ++函数的一种输入是double *
。
函数pointwise_search
的输出是一个指针。我被告知我应该删除它。但我不知道应该删除它,因为我需要它作为输出。
从答案中,我知道我应该通过mxIsSingle
检查输入的类型。所以我更正了函数mexFunction
。但是有一个错误error C2440: '=' : cannot convert from 'void *' to 'float *'
。
在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...
提前致谢。
#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);
}
答案 0 :(得分:1)
在Matlab中使用single()
在调用mexFunction之前转换数据。在C ++端,通过mxIsSingle()
验证该类型确实是单一的。在此之后,您可以愉快地投射到float*
。
答案 1 :(得分:1)
在您担心MEX代码之前,请先看看您的C ++函数。您有一些非常明显的memory leaks(new
但没有delete[]
)。
关于MEX,你永远不应该看到这个:
(float *)mxGetPr(prhs[0])
您无法将double*
投射到float*
并期望数字有任何意义。从MATLAB输入single
并使用:
(float *)mxGetData(prhs[0])
并按照Trilarion的建议并测试所有输入mxArray
的预期数据类型。