<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/173912</link>
    <title>MATLAB Central Newsreader - how to pass a function from Matlab to mex file</title>
    <description>Feed for thread: how to pass a function from Matlab to mex file</description>
    <language>en-us</language>
    <copyright>&amp;copy;1994-2012 by MathWorks, Inc.</copyright>
    <webmaster>webmaster@mathworks.com</webmaster>
    <generator>MATLAB Central Newsreader</generator>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <ttl>60</ttl>
    <image>
      <title>MathWorks</title>
      <url>http://www.mathworks.com/images/membrane_icon.gif</url>
    </image>
    <item>
      <pubDate>Thu, 07 Aug 2008 09:34:01 -0400</pubDate>
      <title>how to pass a function from Matlab to mex file</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/173912#447795</link>
      <author>Damian H</author>
      <description>Hi there,&lt;br&gt;
&lt;br&gt;
I'm new with mex and need your help. I want to use C&lt;br&gt;
function (exactly amebsa.c routine) in MAtlab, but I don't&lt;br&gt;
know how to pass a function from Matlab to mex file.&lt;br&gt;
&lt;br&gt;
The code is quite long so i will put here only a part&lt;br&gt;
concerning my mex problem.&lt;br&gt;
&lt;br&gt;
All questions are listed from Q.1. to Q.6.&lt;br&gt;
You can just answer i.e.:&lt;br&gt;
&amp;nbsp;Q.1. It's easier than you could imagine...&lt;br&gt;
&lt;br&gt;
or post correct mexFunction &lt;br&gt;
&lt;br&gt;
------------------------------------------------------&lt;br&gt;
My SSA.m file is a function:&lt;br&gt;
-------------------------------------------------------&lt;br&gt;
&lt;br&gt;
function [x,fval]=SSA(catalog,name)&lt;br&gt;
&lt;br&gt;
//within this function I declare random values of x:&lt;br&gt;
x       = rand(8,1);&lt;br&gt;
&lt;br&gt;
//then i have a subfunction, which takes an x, for this x&lt;br&gt;
//calculates many others parameters and returns sum of&lt;br&gt;
//squares of them.&lt;br&gt;
function [SumOfSquares]=sse(x)&lt;br&gt;
&lt;br&gt;
//I want to optimize my function sse(x) and use for this C&lt;br&gt;
//function 'amebsa.c'.&lt;br&gt;
//I call this function with many input parameters, also&lt;br&gt;
//with my function sse(x).&lt;br&gt;
&lt;br&gt;
[pb,yb]= amebsa(p, y, n_dim, TolFun, @sse, iter, Temp_begin);&lt;br&gt;
&lt;br&gt;
//...  &lt;br&gt;
end&lt;br&gt;
---------------------------------------------------&lt;br&gt;
My mex gateway function amebsa.c &lt;br&gt;
---------------------------------------------------- &lt;br&gt;
#include &quot;mex.h&quot;&lt;br&gt;
&lt;br&gt;
//Instead of operation on arrays I use names:&lt;br&gt;
/* Input Arguments */&lt;br&gt;
&lt;br&gt;
#define	simplex_vectors         prhs[0]&lt;br&gt;
#define	f_begin_values          prhs[1]&lt;br&gt;
#define n_dimensions            prhs[2]&lt;br&gt;
#define convergence_tolerance   prhs[3]&lt;br&gt;
#define function                prhs[4]&lt;br&gt;
#define n_iterations            prhs[5]&lt;br&gt;
#define temperature             prhs[6]&lt;br&gt;
&lt;br&gt;
/* Output Arguments */&lt;br&gt;
&lt;br&gt;
#define	optimized_function      plhs[0]&lt;br&gt;
#define	optimal_vector          plhs[1]&lt;br&gt;
&lt;br&gt;
// function amebsa&lt;br&gt;
&lt;br&gt;
void amebsa(float **p, float y[], int ndim, float pb[],&lt;br&gt;
float *yb, float ftol, float (*funk)(float []), int *iter,&lt;br&gt;
float temptr)&lt;br&gt;
{&lt;br&gt;
//... is not important for this problem what's inside&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
//Now is my mexFunction, the problem is with a pointer &lt;br&gt;
//float *funk, which needs to pass a pointer to my sse(x)&lt;br&gt;
//function from Matlab to amebsa function. &lt;br&gt;
//Q.1. How to do it?&lt;br&gt;
&lt;br&gt;
void mexFunction( int nlhs, mxArray *plhs[], &lt;br&gt;
		  int nrhs, const mxArray*prhs[] )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
{ &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float *p; &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float *y;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int   *ndim;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float *pb;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float *yb;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float *ftol;&lt;br&gt;
&lt;br&gt;
//Q.2.How to declare funk, so that it pass a &lt;br&gt;
//    float (*funk)(float [])??  &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float *funk;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int   *iter;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float *temptr;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mwSize m,n; &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Create a matrix for the return argument */ &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m = mxGetM(f_begin_values)-1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;n = mxGetN(f_begin_values);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;optimal_vector     = mxCreateDoubleMatrix(m, n, mxREAL);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m = mxGetM(temperature);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;n = mxGetN(temperature);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;optimized_function = mxCreateDoubleMatrix(m, n, mxREAL); &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Assign pointers to the various parameters */ &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p =     (float*)mxGetPr(simplex_vectors);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y =     (float*)mxGetPr(f_begin_values);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ndim =  (int*)mxGetPr(n_dimensions);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pb =    (float*)mxGetPr(optimal_vector);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;yb =    (float*)mxGetPr(optimized_function);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ftol =  (float*)mxGetPr(convergence_tolerance);&lt;br&gt;
&lt;br&gt;
//Q.3.Should I use here mxGetPr? &lt;br&gt;
//Q.4.'function' is not an array and mxGetPr returns only a&lt;br&gt;
//double pointer (I can cast it to float pointer or integer&lt;br&gt;
//pointer, but to pointer to float function(pointer to //float)?&lt;br&gt;
//Q.5. Is there any solution how to deal with this problem? &lt;br&gt;
//Q.6. How does the mex pass it right now? As what,&lt;br&gt;
//structure? object?&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;funk =  (float*)mxGetPr(function);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iter =  (int*)mxGetPr(n_iterations);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;temptr =(float*)mxGetPr(temperature);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Do the actual computations in a subroutine */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;amebsa(&amp;p,y,*ndim,pb,yb,*ftol,funk,iter,temptr); &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
}&lt;br&gt;
---------------------------------------------------------&lt;br&gt;
When I try to compile a code written above:&lt;br&gt;
--------------------------------------------------------&lt;br&gt;
&amp;gt;&amp;gt; mex amebsa.c amotsa.c ran1.c nrutil.c&lt;br&gt;
&amp;nbsp;&lt;br&gt;
//I get:&lt;br&gt;
Warning amebsa.c: 146  assignment of pointer to float&lt;br&gt;
function(pointer to float) to pointer to float &lt;br&gt;
&lt;br&gt;
//If i change declaration in mexFunction 'float *funk' to &lt;br&gt;
float (*funk)(float [])&lt;br&gt;
&lt;br&gt;
//and instead of 'funk = (float*)mxGetPr(function)'&lt;br&gt;
funk =  (float* (float //[]))mxGetPr(function)&lt;br&gt;
&lt;br&gt;
//I get a message:&lt;br&gt;
Error amebsa.c: 141  cast from `pointer to double' to&lt;br&gt;
`pointer to float function(pointer to float)' is illegal&lt;br&gt;
//(It's because mxGetPr returns only a double pointer) &lt;br&gt;
&lt;br&gt;
&lt;br&gt;
!!!thanks a lot for looking at it!!!</description>
    </item>
    <item>
      <pubDate>Sat, 09 Aug 2008 06:19:01 -0400</pubDate>
      <title>Re: how to pass a function from Matlab to mex file</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/173912#448282</link>
      <author>James Tursa</author>
      <description>&quot;Damian H&quot; &amp;lt;damiana@poczta.onet.pl&amp;gt; wrote in message&lt;br&gt;
&amp;lt;g7efi9$o2$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt;  Q.1. It's easier than you could imagine...&lt;br&gt;
&amp;gt; &lt;br&gt;
&lt;br&gt;
It's impossible to do what you are trying to do.&lt;br&gt;
&lt;br&gt;
&amp;gt; //Q.1. How to do it?&lt;br&gt;
&amp;gt; &lt;br&gt;
&lt;br&gt;
You can't.&lt;br&gt;
&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; //Q.2.How to declare funk, so that it pass a &lt;br&gt;
&amp;gt; //    float (*funk)(float [])??  &lt;br&gt;
&lt;br&gt;
You can't.&lt;br&gt;
&lt;br&gt;
&amp;gt;     ftol =  (float*)mxGetPr(convergence_tolerance);&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; //Q.3.Should I use here mxGetPr? &lt;br&gt;
&lt;br&gt;
Yes you should use mxGetPr, but you shouldn't use (float *)&lt;br&gt;
or floats. My guess is you are passing in doubles from&lt;br&gt;
MATLAB, not singles (floats). So declare your variables as&lt;br&gt;
double, not float. Don't use float anywhere.&lt;br&gt;
&lt;br&gt;
&amp;gt; //Q.4.'function' is not an array and mxGetPr returns only a&lt;br&gt;
&amp;gt; //double pointer (I can cast it to float pointer or integer&lt;br&gt;
&amp;gt; //pointer, but to pointer to float function(pointer to&lt;br&gt;
//float)?&lt;br&gt;
&lt;br&gt;
Can't do this.&lt;br&gt;
&lt;br&gt;
&amp;gt; //Q.5. Is there any solution how to deal with this problem? &lt;br&gt;
&lt;br&gt;
Yes. See below.&lt;br&gt;
&lt;br&gt;
&amp;gt; //Q.6. How does the mex pass it right now? As what,&lt;br&gt;
&amp;gt; //structure? object?&lt;br&gt;
&lt;br&gt;
It is passing it as a function_handle mxArray.&lt;br&gt;
&lt;br&gt;
------------&lt;br&gt;
&lt;br&gt;
Here are the details.&lt;br&gt;
&lt;br&gt;
First, you cannot do what you are trying to do with the&lt;br&gt;
function pointer in C, unfortunately. The value of a MATLAB&lt;br&gt;
function_handle is a proprietary thing that has nothing&lt;br&gt;
whatsoever to do with a C function pointer. i.e., there is&lt;br&gt;
no way to take the MATLAB function_handle and somehow&lt;br&gt;
retrieve an address for an entry point to that function in&lt;br&gt;
memory and then use that in your C code. And even if you&lt;br&gt;
could do this, you would not be passing float[] arrays to it&lt;br&gt;
and returning float variables ... you would have to pass&lt;br&gt;
mxArray pointers to it. So the whole architecture of what&lt;br&gt;
you are trying to do will not work.&lt;br&gt;
&lt;br&gt;
Having said that, you *can* call MATLAB functions from&lt;br&gt;
within C code using the mexCallMATLAB function. You will&lt;br&gt;
need to first convert the passed in function_handle to a&lt;br&gt;
character string, and then convert any C arrays into&lt;br&gt;
mxArrays, but it can be done. I have shown a simple example&lt;br&gt;
below.&lt;br&gt;
&lt;br&gt;
And why are you using float types in your C code instead of&lt;br&gt;
double types in the first place? The default numeric type in&lt;br&gt;
MATLAB is double, not float (single). Seems like you are&lt;br&gt;
making an unnecessary complication here. And your own code&lt;br&gt;
seems to be inconsistent anyway. For example, you use&lt;br&gt;
rand(8,1) in one of your functions. This will produce a&lt;br&gt;
double array. So if you are intending this to be passed into&lt;br&gt;
the mex routine you better be expecting a double, not a float.&lt;br&gt;
&lt;br&gt;
James Tursa&lt;br&gt;
&lt;br&gt;
---------------------------------------------------&lt;br&gt;
&lt;br&gt;
call this myfunction.m (the actual name is arbitrary):&lt;br&gt;
&lt;br&gt;
function y = myfunction(x)&lt;br&gt;
y = sqrt(x);&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
---------------------------------------------------&lt;br&gt;
&lt;br&gt;
call this fhandletest.c:&lt;br&gt;
&lt;br&gt;
// Performs y = fhandletest(@myfunction)&lt;br&gt;
//&lt;br&gt;
// Where:  fhandletest is this file (i.e., mex fhandletest.c)&lt;br&gt;
//         myfunction is a MATLAB function or m-file that&lt;br&gt;
takes a 1x5 double and&lt;br&gt;
//                    produces one output. The actual name&lt;br&gt;
of myfunction is&lt;br&gt;
//                    arbitrary.&lt;br&gt;
&lt;br&gt;
#include &amp;lt;string.h&amp;gt;&lt;br&gt;
#include &quot;mex.h&quot;&lt;br&gt;
&lt;br&gt;
// Gateway&lt;br&gt;
&lt;br&gt;
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const&lt;br&gt;
mxArray *prhs[])&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double d[] = {1.0, 2.0, 3.0, 4.0, 5.0};&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char *fname;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mxArray *lhs[1], *rhs[1];&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if( nrhs != 1 )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexErrMsgTxt(&quot;Need 1 input argument\n&quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if( nlhs &amp;gt; 1 )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexErrMsgTxt(&quot;Only 1 output argument allowed\n&quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if( mxGetClassID(prhs[0]) == mxFUNCTION_CLASS ) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexPrintf(&quot;detected function_handle\n&quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if( mexCallMATLAB(1, lhs, 1, prhs, &quot;char&quot;) ) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexErrMsgTxt(&quot;Unable to convert function handle&lt;br&gt;
to name string\n&quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fname = mxArrayToString(lhs[0]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mxDestroyArray(lhs[0]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} else if( mxIsChar(prhs[0]) ) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexPrintf(&quot;detected char string\n&quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fname = mxArrayToString(prhs[0]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} else {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexErrMsgTxt(&quot;1st argument must be function handle&lt;br&gt;
or name\n&quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexPrintf(&quot;function name is %s\n&quot;,fname);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexPrintf(&quot;creating input to function %s\n&quot;,fname);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rhs[0] = mxCreateDoubleMatrix(1, 5, mxDOUBLE_CLASS, mxREAL);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memcpy(mxGetPr(rhs[0]), d, sizeof(d));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexPrintf(&quot;calling %s\n&quot;,fname);    &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if( mexCallMATLAB(1, plhs, 1, rhs, fname) ) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexPrintf(&quot;Unable to call function %s\n&quot;,fname);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexErrMsgTxt(&quot; &quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
// clean up temorary stuff&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mxDestroyArray(rhs[0]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mxFree(fname);&lt;br&gt;
}</description>
    </item>
    <item>
      <pubDate>Mon, 01 Dec 2008 21:42:01 -0500</pubDate>
      <title>Re: how to pass a function from Matlab to mex file</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/173912#614301</link>
      <author>Ryan Ollos</author>
      <description>&quot;James Tursa&quot; &amp;lt;aclassyguywithaknotac@hotmail.com&amp;gt; wrote in message &amp;lt;g7jcsl$qs0$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; Having said that, you *can* call MATLAB functions from&lt;br&gt;
&amp;gt; within C code using the mexCallMATLAB function. You will&lt;br&gt;
&amp;gt; need to first convert the passed in function_handle to a&lt;br&gt;
&amp;gt; character string, and then convert any C arrays into&lt;br&gt;
&amp;gt; mxArrays, but it can be done. I have shown a simple example&lt;br&gt;
&amp;gt; below.&lt;br&gt;
&lt;br&gt;
I have found that it is also possible to use function handles by calling feval in mexCallMATLAB, which avoids the need to convert the function_handle to a character string.  The mex function is:&lt;br&gt;
&lt;br&gt;
/* mexFEval */&lt;br&gt;
&lt;br&gt;
#include &quot;mex.h&quot;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
void&lt;br&gt;
mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Evaluate string in MATLAB workspace */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( mxIsClass(prhs[0], &quot;function_handle&quot;) )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexCallMATLAB(nlhs, plhs, nrhs, prhs, &quot;feval&quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexErrMsgTxt(&quot;First Input is not a function handle.&quot;);            &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;    &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
Then I can call it like this:&lt;br&gt;
&lt;br&gt;
[outArg1, outArg2, ...] = mexEvalFunctionHandle(function_handle, inArg1, inArg2)</description>
    </item>
    <item>
      <pubDate>Mon, 01 Dec 2008 21:55:03 -0500</pubDate>
      <title>Re: how to pass a function from Matlab to mex file</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/173912#614304</link>
      <author>Ryan Ollos</author>
      <description>Btw, I got the idea for this from the note at the end of this thread.&lt;br&gt;
&lt;a href=&quot;http://www.mathworks.com/support/bugreports/details.html?rp=334200&quot;&gt;http://www.mathworks.com/support/bugreports/details.html?rp=334200&lt;/a&gt;</description>
    </item>
  </channel>
</rss>

