    // 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 struct, prints a few of its fields,
        and then returns a new struct.

        For example, you can call this function in MATLAB like so:
            input = {}
            input.val = 2
            input.stuff = 'some string'
            output = example_mex_struct(input)

            output.number
            output.number2
            output.sub.stuff
            output.sub.some_matrix
    */

    void mex_function (
        const matlab_struct& input,
        matlab_struct& output
    )
    {
        int val = input["val"];
        string stuff = input["stuff"];

        if (input.has_field("val2"))
        {
            string val2 = input["val2"];
            cout << "The optional val2 field was set to: " << val2 << endl;
        }

        cout << "val: "<< val << endl;
        cout << "stuff: " << stuff << endl;

        output["number"] = 999;

        output["number2"] = 1000;
        output["sub"]["stuff"] = "some other string";
        matrix<double> m = randm(2,2);
        output["sub"]["some_matrix"] = m;
    }

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