Это не должно работать, поскольку MATLAB не хочет, чтобы "параметры правой стороны" изменялись . См. Например онлайн-справку :
prhs [is] Массив указателей для ввода данных. Входные данные доступны только для чтения и
не должен изменяться вашей mexFunction.
Именно поэтому заголовок вашей функции
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
говорит const mxArray *prhs[]
, а не mxArray *prhs[]
. Если вы хотите вернуть значение, вы должны сделать это через mxArray *plhs[]
. Я думаю, что поведение при изменении «параметра правой стороны» просто не определено, и рекомендую прочитать полное руководство по MEX файлам для получения дополнительной информации.
UPDATE
Чтобы ответить на ваш актуальный вопрос , я предполагаю, что когда вы передаете y
своей функции, MATLAB вручает вам фактический указатель и (ложно) доверяет вам не связываться с ним; когда вы передаете свою функцию y(:,1)
MATLAB создает копию этой части массива и передает вам указатель на эту копию, которая сбрасывается после вызова вашей функции.
Если вы настаиваете на этом , по крайней мере прочитайте Редактирование на месте Matlab mex на недокументированном Matlab, как указано в комментариях reve_etrange ! По сути, вы должны запустить
mxUnshareArray(const_cast<mxarray *>(prhs[0]), true);
перед тем, как изменить этот массив. В противном случае работает
>> y = zeros(2, 2);
>> y_backup=y;
>> mex_test_array(y);
приведет к
>> y
y =
3.1416 0
0 0
>> y_backup
y =
3.1416 0
0 0
... что делает для какого-то адского кода неуправляемым!