在mex文件中,我无法通过matlab2016a中的指针覆盖标量,虽然我可以覆盖2013a中的标量以及2016a中的数组

时间:2016-10-07 12:06:14

标签: matlab pointers mex

[环境]

操作系统: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中运行。

请帮帮我。

1 个答案:

答案 0 :(得分:0)

我很确定你不是要在mex函数中修改输入数组。更多细节Does Matlab ever copy data passed to a mex function?。 “matlab”解决方案可能是将修改后的数组作为mex的输出返回,而不是在适当的位置进行修改。