    // The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt

    #include "call_matlab.h"
    #include "dlib/matrix.h"

    using namespace dlib;
    using namespace std;

    /*
        This mex function takes a MATLAB function handle, calls it, and
        returns the results.

        For example, you can call this function in MATLAB like so:
            A = magic(3)
            y = example_mex_callback(A, @(x)x+x)

        This will result in y containing the value 2*A.
    */

    void mex_function (
        const matrix<double>& A,
        const function_handle& f,
        matrix<double>& result
    )
    {
        // The f argument to this function is a function handle passed from MATLAB.  To
        // call it we use the following syntax:
        call_matlab(f, A, returns(result));
        // This is equivalent to result = f(A). Therefore, the returns(variable) syntax
        // is used to indicate which variables are outputs of the function.

        // Another thing we can do is call MATLAB functions based on their string name
        // rather than a function_handle.  Here is an example of calling eigs().
        matrix<double> m(2,2);
        m = 1,2,
            3,4;
        matrix<double> v,d;

        // This is equivalent to [v,d] = eigs(m);
        call_matlab("eigs", m, returns(v), returns(d));
        cout << "eigenvectors: \n" << v << endl;
        cout << "eigenvalues:  \n" << d << endl;
    }

    // #including this brings in all the mex boiler plate needed by MATLAB.
    #include "mex_wrapper.cpp"