MATLAB--C
Publicado por rosa (17 intervenciones) el 17/04/2009 19:32:03
Hola,
no se si es el foro mas adecuado pero como se trata de una interfaz entre MATLAB y C, lo escribo aqui mismo, que la experiencia en foros me dice que los programadores de MATLAB por alguna extragna razon son mas estirados.
Esta es mi duda:
Mi problema en cuestion es que llamando desde MATLAB a una funcion en C, necesito recuperar un array de 361x181 y no se como hacerlo al tratarse de punteros dobles.
os pongo mi codigo para que explicarme mejor,ok?
void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
{
int buflen = (mxGetM(prhs[0]) * mxGetN(prhs[0])*sizeof(mxChar))+1;
char *buf = new char[buflen];
mxGetString(prhs[0], buf, buflen);
if(strcmp("Simulate",buf)==0)
{
....
}
else if(strcmp("loss",buf)==0)
{
if(nrhs=6)
{
float freq=ZERO;
double *X[181];
double *Y[181];
double *Z[181];
double *pos=NULL;
struct SatVEC *sat;
double **L=NULL;
int ii=ZERO;
int jj=ZERO;
mwSize size_memo=65341;
double *new_pr=NULL;
freq=(float)mxGetScalar(prhs[1]);
prhs[2]=mxCreateDoubleMatrix(361,181,mxREAL); //AQUI!!!
new_pr=(double*)mxCalloc(size_memo,sizeof(double));
new_pr=X;
X=mxGetPr(prhs[2]);
prhs[3]=mxCreateDoubleMatrix(361,181,mxREAL);
new_pr=(double*)mxCalloc(size_memo,sizeof(double));
new_pr=Y;
Y=mxGetPr(prhs[3]);
prhs[4]=mxCreateDoubleMatrix(361,181,mxREAL);
new_pr=(double*)mxCalloc(size_memo,sizeof(double));
new_pr=Z;
Z=mxGetPr(prhs[4]);
pos=mxGetPr(prhs[5]);
sat->pos[0]=*pos;
sat->pos[1]=*(pos+1);
sat->pos[2]=*(pos+2);
L=loss(X,Y,Z,sat,freq);
mxSetPr(plhs[0],*L);
}
else
{
mexErrMsgTxt("Errosinput arguments");
}
return;
}
los parametros de entrada prhs[2],prhs[3] y prhs[4] son como he dicho arrays procedentes de MATLAB de 361x181. y me gustaria recuperarlos en C para pasarlos como parametros de entrada a la funcion loss, que la tengo definida como
double** loss(double X[361][181],double Y[361][181],double Z[361][181],struct SatVEC *sat,float freq)
El codigo que he puesto, es el ultimo que he probado pero todos los anteriores me han dado el mismo problema y es que cuando recupero la direccion con mxGetPr me devuelve un puntero y mis matrices estan definidas como puntero a puntero....¿alguien sabe como podria solucionarlo?
muchas gracias y espero de todo corazon una respuesta
no se si es el foro mas adecuado pero como se trata de una interfaz entre MATLAB y C, lo escribo aqui mismo, que la experiencia en foros me dice que los programadores de MATLAB por alguna extragna razon son mas estirados.
Esta es mi duda:
Mi problema en cuestion es que llamando desde MATLAB a una funcion en C, necesito recuperar un array de 361x181 y no se como hacerlo al tratarse de punteros dobles.
os pongo mi codigo para que explicarme mejor,ok?
void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
{
int buflen = (mxGetM(prhs[0]) * mxGetN(prhs[0])*sizeof(mxChar))+1;
char *buf = new char[buflen];
mxGetString(prhs[0], buf, buflen);
if(strcmp("Simulate",buf)==0)
{
....
}
else if(strcmp("loss",buf)==0)
{
if(nrhs=6)
{
float freq=ZERO;
double *X[181];
double *Y[181];
double *Z[181];
double *pos=NULL;
struct SatVEC *sat;
double **L=NULL;
int ii=ZERO;
int jj=ZERO;
mwSize size_memo=65341;
double *new_pr=NULL;
freq=(float)mxGetScalar(prhs[1]);
prhs[2]=mxCreateDoubleMatrix(361,181,mxREAL); //AQUI!!!
new_pr=(double*)mxCalloc(size_memo,sizeof(double));
new_pr=X;
X=mxGetPr(prhs[2]);
prhs[3]=mxCreateDoubleMatrix(361,181,mxREAL);
new_pr=(double*)mxCalloc(size_memo,sizeof(double));
new_pr=Y;
Y=mxGetPr(prhs[3]);
prhs[4]=mxCreateDoubleMatrix(361,181,mxREAL);
new_pr=(double*)mxCalloc(size_memo,sizeof(double));
new_pr=Z;
Z=mxGetPr(prhs[4]);
pos=mxGetPr(prhs[5]);
sat->pos[0]=*pos;
sat->pos[1]=*(pos+1);
sat->pos[2]=*(pos+2);
L=loss(X,Y,Z,sat,freq);
mxSetPr(plhs[0],*L);
}
else
{
mexErrMsgTxt("Errosinput arguments");
}
return;
}
los parametros de entrada prhs[2],prhs[3] y prhs[4] son como he dicho arrays procedentes de MATLAB de 361x181. y me gustaria recuperarlos en C para pasarlos como parametros de entrada a la funcion loss, que la tengo definida como
double** loss(double X[361][181],double Y[361][181],double Z[361][181],struct SatVEC *sat,float freq)
El codigo que he puesto, es el ultimo que he probado pero todos los anteriores me han dado el mismo problema y es que cuando recupero la direccion con mxGetPr me devuelve un puntero y mis matrices estan definidas como puntero a puntero....¿alguien sabe como podria solucionarlo?
muchas gracias y espero de todo corazon una respuesta
Valora esta pregunta


0