Переменные Matlab показывают «ссылочно-подобное» поведение при копировании и передаче в мекс-файл - PullRequest
6 голосов
/ 24 января 2012

У меня есть mex-файл (скомпилированный в VS2010, Matlab 2010b), который принимает переменную и изменяет ее. Например, в mex-файле это выглядит так:

double *fp = (double *)mxGetPr (prhs[0]);
*fp = someDoubleValue;

Чтобы сравнить реализацию Matlab и реализацию mex, я делаю копию переменной перед вызовом файла mex:

var_mex = var;
mymex (var_mex);

К моему удивлению, var_mex и var меняются (на одно и то же значение, конечно), как если бы я создал ссылку на var, а не ее копию.

Это известная проблема? Как я могу убедить Matlab скопировать переменную?

EDIT

Так как я подозревал, что эта проблема является результатом того, что Matlab оптимизирует управление памятью, я произвел некоторые вычисления "ничего не делать" на var перед вызовом mex-файла, т.е.

var=var+1;
var=var-1;

и это действительно решает проблему. Я все еще был бы рад получить некоторую информацию (или другие предложения) по этому поводу, если бы кто-то также сталкивался с этим.

Ответы [ 2 ]

7 голосов
/ 24 января 2012

В MATLAB большинство переменных передаются вокруг , как если бы они передавались по значению. Заметным исключением является то, что экземпляры классов, которые наследуются от handle, явно передаются по ссылке.

Здесь есть запись в блоге , в которой подробно рассказывается об этом.

Итак, когда вы выполните

var_mex = var;

В результате вы получите var_mex со ссылкой на те же данные, что и var.

Когда вы пишете в mxArray внутри мекс-функции, у вас есть большие возможности взломать вещи, потому что вы получили базовый адрес данных. Если вы измените элемент массива prhs, вы можете непреднамеренно изменить другие переменные, использующие те же данные. Так что не делай этого. Фактически, mex doc прямо говорит вам не делать этого.

Причина, по которой работает трюк var + 1, заключается в том, что, изменяя данные, вы заставляете MATLAB делать копию данных.

0 голосов
/ 24 января 2012

Все переменные в Matlab передаются по значению.

Внесение каких-либо изменений непосредственно в аргументы rhs в функции Matlab официально не поддерживается. Если вы конвертируете функцию Matlab в форме A = func(A), тогда вам «необходимо» сделать копию переданного массива A внутри самой функции.

...