Matlab mx函数的副作用



MEX是Matlab用来在Matlab中运行C/c++函数的框架(运行速度更快)。在文档中说:

输入参数(在prhs数组中找到)是只读的;不要在您的MEX文件中修改它们。更改输入参数中的数据会产生不希望的副作用。

这只是一个关于如何改变作为指针传递的变量将改变该变量的警告,甚至在函数之外(不像Matlab的工作方式),或者有一个更微妙的方式,这可能会弄乱Matlab/MEX接口?

我问的原因是我特别想让MEX函数真实地修改参数。

MATLAB使用延迟复制,这意味着当您执行b = a时,变量b指向与变量a相同的数据,即使在语义上您进行了复制。当你现在做a(1) = 0时,例如,你修改变量a, MATLAB首先做一个拷贝,这样变量b就不受赋值的影响。这显然节省了大量内存,因为生成了许多副本,而副本没有被修改。

例如,在调用函数时,将输入变量的副本放置在函数的工作区中。sum(a)导致a的(惰性)副本在函数内部可用。如果函数不需要修改变量,则避免复制。如果它确实修改了它,那么就会创建一个副本,这样调用者就不会更改a

mex文件的工作方式相同,只是MATLAB无法检测是否修改了输入变量,因此它无法在您修改之前进行复制。因此发出了警告。您需要调用mxDuplicateArray()来复制数组并对新副本进行更改。

文档警告的副作用是调用者工作区中的变量以及与之共享数据的所有变量都被修改了。例如,假设您创建了一个修改输入的mex文件函数modifyIn,然后:

a = zeros(500);
b = a;
% much later in the code…
modifyIn(b); % update b the way I want!

也会非常意外地修改a!


这篇关于未记录的MATLAB的博客文章更详细地讨论了这个问题,并讨论了mxUnshareArray(),这是一个未记录的函数,只有在您对可能发生的崩溃和其他可能发生的问题感到满意时才应该使用。未记录的函数的保存时间有限。

最新更新