How can recursive functions be written in matlab mex ?
Show older comments
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 Comments
Jan
on 17 Dec 2012
Without seeing the code, it is impossible to guess the bug.
Jan
on 18 Dec 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.
Answers (1)
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 Comments
Sujan
on 20 Dec 2012
James Tursa
on 20 Dec 2012
Are you trying to have the recursion take place within the mex function itself? If so, then you need to provide a recurs() function as Jan indicates (a slow and resourse wasting way to do this btw). If you are trying to have the recursion take place at the MATLAB level then you would need to use the mexCallMATLAB API function (an even slower and more resource wasting way to do this btw). Or just write a loop at the C level to calculate the result (faster than both of the above). Which way of recursion are you trying to do ... C level or MATLAB level?
When the file is called "recurs.c", you call it from Matlab as "recurs()", but this is not possible from inside a C-function. You would need to call "mexFunction()" instead, but this command requires Matlab arrays as input, not a pointer to a double array. Therefore I see a general confusion of Matlab, C and the concept of recursive functions. As James I recommend to re-design the function from the scratch.
Sujan
on 20 Dec 2012
Jan
on 20 Dec 2012
If this is an exercise only, try it in Matlab at first, because this is less suceptible for errors than C.
James Tursa
on 20 Dec 2012
@Sujan: Are you simply trying to learn how to do recursion within a mex function, and a factorial was just an example problem to work on to aid the learning process? Or is this entire exercise part of another problem that you are trying to speed up with a mex routine? I am still confused as to what your overall problem and goal is.
Sujan
on 25 Dec 2012
Walter Roberson
on 25 Dec 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.
Categories
Find more on Write C Functions Callable from MATLAB (MEX Files) in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!