2016-10-07 5 views
0

に配列することができるが、私は、matlab2016aにポインタを介してスカラを上書きすることはできません[環境]、Iは2013aにスカラーを上書きしても2016a

OS:OSX10.11とMAXOSシエラ(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ファイルは、ポインタを介してスカラーと行列の一部を上書きする関数です。

in matlab2013aコマンドウィンドウ(matlab2013aのスカラー)

a = 1; 
destructiveMatrixWriteAtIndices(a, 3, 0); 

変数 "a"は "3"になります。

matlab2013aとmatlab2016aコマンドウィンドウ(matlab2013aとmatlab2016aにおけるマトリックス)

a = [1, 2]; 
destructiveMatrixWriteAtIndices(a, 3, 0); 

及び変数 "" "[3,2]" となります。

in matlab2016aコマンドウィンドウ(matlab2016aのスカラー)

a = 1; 
destructiveMatrixWriteAtIndices(a, 3, 0); 

変数 "a"は "1"になります!どうして?

私もlldbを使い、このコードの奇妙な動作を明らかにしました。

matlab2013aとmatlab2016aでは、次のスニペットを実行します。 [0] = 3(* MTX = 3、またはprhs

a = 1; 
destructiveMatrixWriteAtIndices(a, 3, 0); 

lldbは、両方のMATLABでMEX関数の末尾に "* MTX = 3" を明らかにしたが、MEX機能は、結果を渡すことができませんでした)だけmatlab2016aのポインタを介して。

これは非常に奇妙な動作です!

※このmex関数は非常に危険ですが、このmex関数は、使用する必要があるパッケージのいくつかの点で使用されていたことがわかりました。したがって、私はこのmexファイルを修正し、パッケージをmatlab2016aで実行する必要があります。

私を助けてください。

答えて

0

私はあなたがmex関数で入力配列を変更するつもりはないと確信しています。詳細はこちらDoes Matlab ever copy data passed to a mex function?。 "matlab"の解決策はおそらく、修正された配列をmexの出力として返すことです。

+0

有用な情報を教えていただきありがとうございます。 私は古いMATLABパッケージを使用しなければなりませんでした。できるだけ小さな修正をしたいと思っていましたが、今はこのmexルーチンがもう役に立たず危険です。したがって、通常のMATLABインデックス作成を使用して、このmexルーチンを含むいくつかのセクションを書き直します。 – rvkH7sfa3

関連する問題