我有一个MEX函数,我需要从Matlab获取调用此MEX函数的函数的名称。有办法怎么做? 我试过了
mexCallMatlab(...,"dbstack")
但是,它返回一个空结果,因为它可能在工作区中运行。
是的,我知道我可以直接传递函数名作为参数,但这对我来说不是一个选项。
答案 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