[环境]
操作系统:OSX10.11和maxOS Sierra(10.12)
MATLAB:matlab2013a和matlab2016a
Xcode:xcode7和xcode8
在我的工作中,我必须在旧包中使用以下mex文件。
//destructiveMatrixWriteAtIndices.c
//------------------------------------------------------
#include <matrix.h> /* Matlab matrices */
#include <mex.h>
#include <stddef.h> /* NULL */
#define notDblMtx(it) (!mxIsNumeric(it) || !mxIsDouble(it) || mxIsSparse(it) || mxIsComplex(it))
void mexFunction(int nlhs, /* Num return vals on lhs */
mxArray *plhs[], /* Matrices on lhs */
int nrhs, /* Num args on rhs */
const mxArray *prhs[] /* Matrices on rhs */
)
{
double *mtx;
double *newValues;
double *doubleStartIndex;
int i, startIndex, size;
mxArray *arg;
if (nrhs != 3) mexErrMsgTxt("requires 3 arguments.");
/* ARG 1: MATRIX */
arg = prhs[0];
if notDblMtx(arg) mexErrMsgTxt("MTX arg must be a real non-sparse matrix.");
mtx = mxGetPr(arg);
arg = prhs[1];
if notDblMtx(arg) mexErrMsgTxt("MTX arg must be a real non-sparse matrix.");
newValues = mxGetPr(arg);
size = (int) mxGetM(arg) * mxGetN(arg);
arg = prhs[2];
if notDblMtx(arg) mexErrMsgTxt("MTX arg must be a real non-sparse matrix.");
doubleStartIndex = mxGetPr(arg);
startIndex = (int) doubleStartIndex[0];
for (i=0; i<size; i++){
mtx[i+startIndex] = newValues[i];
}
return;
}
//------------------------------------------------------
这个mex文件是通过指针覆盖标量和矩阵部分的函数。
e.g。在matlab2013a命令窗口(matlab2013a中的标量)
a = 1;
destructiveMatrixWriteAtIndices(a, 3, 0);
和变量&#34; a&#34;变成&#34; 3&#34;。
e.g。在matlab2013a和matlab2016a命令窗口(matlab2013a和matlab2016a中的矩阵)
a = [1, 2];
destructiveMatrixWriteAtIndices(a, 3, 0);
和变量&#34; a&#34;变成&#34; [3,2]&#34;。
e.g。在matlab2016a命令窗口(matlab2016a中的标量)
a = 1;
destructiveMatrixWriteAtIndices(a, 3, 0);
和变量&#34; a&#34;成为&#34; 1&#34;!为什么呢?
我也使用了lldb,并揭示了这段代码的奇怪行为。
在matlab2013a和matlab2016a中,当我运行以下代码段时。
a = 1;
destructiveMatrixWriteAtIndices(a, 3, 0);
lldb透露&#34; * mtx = 3&#34;在两个matlab中的mex函数结束时,mex函数无法通过唯一的matlab2016a中的指针传递结果(* mtx = 3,或prhs [0] = 3)。
这是一种非常奇怪的行为!
※我已经明白这个mex功能非常危险,但是我必须使用这个mex函数在包中的某些点。因此,我必须修复此mex文件并使包在matlab2016a中运行。
请帮帮我。
答案 0 :(得分:0)
我很确定你不是要在mex函数中修改输入数组。更多细节Does Matlab ever copy data passed to a mex function?。 “matlab”解决方案可能是将修改后的数组作为mex的输出返回,而不是在适当的位置进行修改。