Matlab变量在复制并传递给mex文件时显示"类似引用"的行为

Ita*_*atz 6 c matlab mex visual-studio-2010

我有一个mex文件(在VS2010中编译,Matlab 2010b),它接受一个变量,然后更改它.例如,在mex文件中,它看起来像:

double *fp = (double *)mxGetPr (prhs[0]);
*fp = someDoubleValue;
Run Code Online (Sandbox Code Playgroud)

为了比较Matlab实现和mex实现,我在调用mex文件之前复制了变量:

var_mex = var;
mymex (var_mex);
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,这两个var_mexvar变化(至当然相同的值),因为如果我创建一个参考var,而不是它的一个副本.

这是一个已知的问题?我怎样才能说服Matlab复制变量?

编辑

因为我怀疑这个问题是Matlab优化其内存管理的结果,所以var在调用mex文件之前我做了一些"什么都不做"的计算,即

var=var+1;
var=var-1;
Run Code Online (Sandbox Code Playgroud)

确实它解决了这个问题.如果有人遇到它,我仍然很乐意得到一些关于此的信息(或其他建议).

Edr*_*ric 7

在MATLAB中,大多数变量都被传递,就好像它们是按值传递一样.值得注意的例外是,继承的类的实例handle是通过引用显式传递的.

这里有一篇博客文章,详细介绍了这一点.

所以,当你执行

var_mex = var;
Run Code Online (Sandbox Code Playgroud)

你最终会var_mex引用相同的数据var.

当你写一个mxArray内部的mex函数时,你有很大的力量可以破解它,因为你得到了数据的底层地址.如果修改prhs数组的元素,可能会无意中最终修改共享相同数据的其他变量.所以,不要这样做.事实上,mex doc明确告诉你不要这样做.

这个var + 1技巧的作用是通过修改数据,你迫使MATLAB制作数据的副本.