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_mex和var变化(至当然相同的值),因为如果我创建一个参考var,而不是它的一个副本.
这是一个已知的问题?我怎样才能说服Matlab复制变量?
编辑
因为我怀疑这个问题是Matlab优化其内存管理的结果,所以var在调用mex文件之前我做了一些"什么都不做"的计算,即
var=var+1;
var=var-1;
Run Code Online (Sandbox Code Playgroud)
确实它解决了这个问题.如果有人遇到它,我仍然很乐意得到一些关于此的信息(或其他建议).
在MATLAB中,大多数变量都被传递,就好像它们是按值传递一样.值得注意的例外是,继承的类的实例handle是通过引用显式传递的.
这里有一篇博客文章,详细介绍了这一点.
所以,当你执行
var_mex = var;
Run Code Online (Sandbox Code Playgroud)
你最终会var_mex引用相同的数据var.
当你写一个mxArray内部的mex函数时,你有很大的力量可以破解它,因为你得到了数据的底层地址.如果修改prhs数组的元素,可能会无意中最终修改共享相同数据的其他变量.所以,不要这样做.事实上,mex doc明确告诉你不要这样做.
这个var + 1技巧的作用是通过修改数据,你迫使MATLAB制作数据的副本.