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

How to get function calling function from a MEX file

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

mexCallMatlab(...,"dbstack")

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

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

在 MEX 函数中使用 "mexCallMATLAB" 调用 "dbstack" 应该可以解决问题。将 MATLAB 结构体 "dbstack" 的输出转换为字符串时需要稍微小心一点。这是 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

如果你运行 dbstack in the base workspace, the struct will indeed be empty. Here's how I tested it using 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