如何从 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
我有一个 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