Filter löschen
Filter löschen

How can recursive functions be written in matlab mex ?

1 Ansicht (letzte 30 Tage)
Sujan
Sujan am 17 Dez. 2012
Can anyone help me about writing recursive function in matlab mex ? I get error message and then I am told to shutdown and restart matlab. What is the problem ?
  3 Kommentare
Sujan
Sujan am 18 Dez. 2012
Bearbeitet: Jan am 18 Dez. 2012
Here is the code. I have managed to avoid the restart problem but recursion doesn't seem to be working.
#include <mex.h>
#include <math.h>
#include <matrix.h>
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
int i, m, n;
double *data1, *data2;
if (nrhs > 1)
mexErrMsgTxt("The number of input arguments must not be greater than 1.");
i = 0;
m = mxGetM(prhs[i]);
n = mxGetN(prhs[i]);
/*create mxarray for the output*/
plhs[i] = mxCreateDoubleMatrix(m, n, mxREAL);
data1 = mxGetPr(prhs[i]);
data2 = (double*)mxMalloc(m*n * sizeof(double));
if (data1[i] == 1){
data2[i] = 1;
}
else{
data2[i] = data1[i]*recurs((data1[i])-1);
}
mxSetPr(plhs[i], data2);
}
[EDITED, Jan, code formatted]
Jan
Jan am 18 Dez. 2012
It is better to add all information required to understand the problem by editing the question. If there is a larger number of comments, the inital ones are not visible as default, such that readers will understand the full problem after some interactions only. But the faster a reader can understand the question, the more likely is an answer.

Melden Sie sich an, um zu kommentieren.

Antworten (1)

Jan
Jan am 18 Dez. 2012
Bearbeitet: Jan am 18 Dez. 2012
mxGetM replies a size_t variable, which is not an int under 64 bit. Better:
mwSize i, m, n;
It is a bad idea to replace the memory of plhs[0] using mxSetPr without clearing the original array. Although this does not crash Matlab immediately, this is prone to leak memory. It would be saver and more efficient to use the already allocated memory of plhs[0]:
data2 = (double *) mxGetPr(plhs[0]);
You did not show the code of "recurs()", so currently there is no recursion at all. Are you sure that you want to reply [1, 0, 0, ...], when the first inpout value is 1?
It is confusing, that you use "i" as index for the input, the output and the first element of the data. It is not wrong, but using a 0 directly would be more clear.
You do not have to inlcude "matrix.h", when "mex.h" is included already.
  8 Kommentare
Sujan
Sujan am 25 Dez. 2012
@ Jan: with Matlab I have no problems.
@ James: I want to learn mex recursion to speed up using mex routine.
Walter Roberson
Walter Roberson am 25 Dez. 2012
Recursion usually does not speed up routines. Sometimes it makes it easier to write routines, but it seldom makes them any faster.
There are some computer languages in which particular forms of recursion ("tail recursion") are optimized, but MATLAB is not one of them.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Write C Functions Callable from MATLAB (MEX Files) finden Sie in Help Center und File Exchange

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by