Matlab MEX 函数的副作用
Matlab MEX-function side effect
MEX 是 Matlab 在 Matlab 中用于 运行 C/C++ 函数的框架(运行s 更快)。在 the documentation 它说:
input parameters (found in the prhs array) are read-only; do not modify them in your MEX file. Changing data in an input parameter can produce undesired side effects.
这只是一个警告,说明更改作为指针传递的变量将如何在函数外部更改该变量(与 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
!
This blog post on Undocumented MATLAB 更详细地讨论了这个问题,并讨论了 mxUnshareArray()
,这是一个未记录的函数,只有当您真的对可能发生的崩溃和其他可能发生的问题感到满意时才应该使用它.未记录的函数保质期有限。
MEX 是 Matlab 在 Matlab 中用于 运行 C/C++ 函数的框架(运行s 更快)。在 the documentation 它说:
input parameters (found in the prhs array) are read-only; do not modify them in your MEX file. Changing data in an input parameter can produce undesired side effects.
这只是一个警告,说明更改作为指针传递的变量将如何在函数外部更改该变量(与 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
!
This blog post on Undocumented MATLAB 更详细地讨论了这个问题,并讨论了 mxUnshareArray()
,这是一个未记录的函数,只有当您真的对可能发生的崩溃和其他可能发生的问题感到满意时才应该使用它.未记录的函数保质期有限。