Я работал с MEX и обнаружил странное поведение, которое я выделил для следующей очень простой программы:
#include "mex.h"
#include <stdio.h>
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
double *A;
int i;
if ( nrhs != 1
|| nlhs > 1
|| !mxIsDouble(prhs[0])
|| mxIsComplex(prhs[0])
|| mxGetM(prhs[0])!=1
) mexErrMsgTxt("internal error: dtimes2: input error");
A = mxGetPr(prhs[0]);
for (i=0; i<3; i++) A[i] *= 2;
return; }
Итак, проблема заключается в следующем: в сеансе работы с MATLAB
B=[3.2,5.6,9.4]; dtimes2(B); B
и MATLAB говорит: B = 6,4000 11,2000 18,8000
Все идет нормально. Но сейчас:
B=[3.2,5.6,9.4]
и MATLAB говорит: B = 6,4000 11,2000 18,8000
но когда я говорю
B=[-34.5,-57.6,-28.9]
тогда MATLAB говорит: B = -34,5000 -57,6000 -28,9000
Вы видите посередине, я не могу переназначить B, если номера такие же, как и раньше. Итак, проверка реальностью:
A=[1,2,3]; A=2*A; A=[1,2,3]
работает, конечно: MATLAB говорит, что A = [1,2,3] в конце.
MEX предупреждает, что мой компилятор '6.2.1-2', но поддерживается '4.7.x', но для этой простой программы я вряд ли ожидал проблемы. Что здесь не так?