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