如何从MEX文件中获取函数调用函数

时间:2015-01-22 17:11:39

标签: matlab mex

我有一个MEX函数,我需要从Matlab获取调用此MEX函数的函数的名称。有办法怎么做? 我试过了

mexCallMatlab(...,"dbstack")

但是,它返回一个空结果,因为它可能在工作区中运行。

是的,我知道我可以直接传递函数名作为参数,但这对我来说不是一个选项。

2 个答案:

答案 0 :(得分:3)

在MEX函数中使用“mexCallMATLAB”调用“dbstack”应该可以解决问题。将“dbstack”(MATLAB结构)的输出转换为字符串时,需要小心一点。这是C MEX代码

#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, 
  const mxArray *prhs[]) {
    mxArray *mxArr[1];
    mexCallMATLAB(1, mxArr, 0, NULL, "dbstack");

    char *funcName = mxArrayToString(mxGetField(mxArr[0], 0, "name"));

    printf("Function name = %s\n", funcName);
}

这是调用MEX函数的MATLAB函数。

function callMyMex()
myMex();
end

当你运行“callMyMex”函数时,你应该看到输出:

Function name = callMyMex

答案 1 :(得分:3)

如果在基础工作区中运行dbstack,结构将确实为空。以下是我使用mexCallMATLAB测试它的方法:

<强> testMEX.cpp

#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[],  int nrhs, const mxArray *prhs[])
{
    mxArray *dbStruct;
    mexCallMATLAB(1, &dbStruct, 0, NULL, "dbstack");

    plhs[0] = mxDuplicateArray(dbStruct);

    if (mxIsEmpty(dbStruct) || mxGetNumberOfFields(dbStruct) != 3) {
        mexErrMsgTxt("dbstack not available from base workspace");
        return;
    }

    mxArray *callerFileName = mxGetField(dbStruct, 0, "file");
    char *fileStr = mxArrayToString(callerFileName);

    mxArray *callerFunctionName = mxGetField(dbStruct, 0, "name");
    char *funStr = mxArrayToString(callerFunctionName);

    mxArray *callerLineNum = mxGetField(dbStruct, 0, "line");
    int lineNum = static_cast<int>(mxGetScalar(callerLineNum));

    mexPrintf("File: %s\n",fileStr); mxFree(fileStr);
    mexPrintf("Function: %s\n", funStr); mxFree(funStr);
    mexPrintf("Line: %d\n", lineNum);
}

<强> testFun.m

function s = testFun()

s = testMEX;

<强>输出

>> s = testMEX
Error using testMEX
dbstack not available from base workspace 

>> s = testFun
File: testFun.m
Function: testFun
Line: 3

s = 
    file: 'testFun.m'
    name: 'testFun'
    line: 3