2014-09-21 61 views
0

关于懒惰的复制:Matlab会不会复制传递给mexFunction的数据,这会修改它?Matlab有没有复制传递给mex函数的数据?

例如在

myMex(input1(:,:,ii), input2(:,:,ii)) 

可以一个可以肯定的,即输入矩阵不会被复制,这样一方面可以传递的东西,并修改它,而不必返回一个参考?

+0

这是mex函数的一般方法。你是否试图给一个变量作为输入,对它进行修改并查看函数后面的内容(没有返回)。至少在我做的一些事情中,它会修改原来的一个。 – ASantosRibeiro 2014-09-21 12:07:24

+1

@ASantosRibeiro:你不应该修改输入数组。 *(你可以这样做,但是你必须告诉MATLAB“取消共享”它,这样,父范围中的其他变量也不会被意外修改,所以如果你有类似的东西:'y = x; myMexFcn (x);''而且你在MEX函数内部天真地修改'x','y'也会被修改!在其他情况下,可能会有更危险的后果,甚至会导致MATLAB崩溃。)* – Amro 2014-09-21 13:09:55

回答

3

在某些情况下,MATLAB执行一些优化以避免在calling functions时复制数据。

使用MEX函数,输入为const mxArray *prhs[]prhs是指向常数数据的指针数组)。尽管可以在不进行复制的情况下更改输入变量(通过丢弃恒定性),但它是dangerous并且没有官方支持,并且可能会产生意想不到的结果,甚至出现段错误(基于copy-on-write技术的帐户)。官方回答是duplicate the input array,并返回修改后的数组。

如果您愿意使用undocumented features,请参阅mxUnshareArray之类的。以下是article by Yair Altman更详细的说明。

+0

因此,如果人们知道这些事实似乎没有任何协议。在我的情况下,我想将3级4级循环移动到mex。这将节省相当数量的代码,否则将不得不移植到C.我假设,如果mex函数是为特定情况设计的,可能确实简单地转换了'const mxArray *',因为该数组是为由mex函数填充。 – embert 2014-10-02 11:18:08

+0

@embert:是的,我想是的(请阅读我以前的评论以回应ASantosRibeiro)。毕竟你可以在C/C++中做很多事情,只要你知道你在做什么:)只要确保清楚地评论MEX调用的代码就可以了,这表明这是一个潜在的危险操作,可能会在未来中断版本。您还应该将MEX文件放在MATLAB函数旁边的'private'文件夹中,这样它不会被任何其他人调用,导致MATLAB崩溃。 – Amro 2014-10-02 16:56:41

相关问题