MATLAB爱好者论坛-LabFans.com

MATLAB爱好者论坛-LabFans.com (https://www.labfans.com/bbs/index.php)
-   资料存档 (https://www.labfans.com/bbs/forumdisplay.php?f=72)
-   -   Matlab:避免在mex中分配内存 (https://www.labfans.com/bbs/showthread.php?t=22887)

poster 2019-12-10 16:49

Matlab:避免在mex中分配内存
 
我试图使我的mex库避免所有内存分配,即使如此。
到目前为止,mex获得了输入,使用mxCreate...()创建了一些矩阵并返回了此输出。
但是现在我想修改此接口,以便mex本身不做任何分配。
我想到的是,mexFunction将作为输入矩阵来填充值,并将该矩阵作为输出返回。

这应该可行吗?

使我思考这是否是我需要做的所有事情的轻微警报是,左手参数以const的形式出现在mexFunction中,而右手参数为非const。返回输入矩阵作为输出,我需要删除此const。


回答:
有趣的是,前几天我只是在看这个。最好的信息,我发现线程[URL="http://www.mathworks.de/matlabcentral/newsreader/view_thread/21631"]这里[/URL]和[URL="http://www.mathworks.fr/matlabcentral/newsreader/view_thread/252587"]这里[/URL]也是[URL="http://www.mk.tu-berlin.de/Members/Benjamin/mex_sharedArrays"]这个[/URL] 。

基本上,在Matlab世界中,这通常被认为是一件非常糟糕的事情……但是,与此同时,没有任何事情可以阻止您,因此您可以做到这一点-尝试一些简单的示例,您将看到所做的更改已得到传播。只需更改从prhs获得的数据即可(您无需返回任何内容-因为您更改了原始数据,因此原始数据将反映在工作空间中的变量中)。

但是,正如链接中指出的那样,由于Matlabs的写时复制语义,这可能会带来奇怪的后果。设置format debug可以在此方面获得很多直觉。如果执行a=b ,则将看到a和b具有不同的“结构地址”或标头,表示它们是不同的变量,但数据指针pr指向内存中的同一区域。通常,如果您在Matlab中更改y,则会写入时复制,并且在更改之前先复制数据区域,因此y之后有一个新的数据指针。当您更改mex中的内容时,这不会发生,因此,如果您更改y,x也会更改。

我认为这样做是可以的-如果您需要处理大型数据集,这是非常有用的,但是您需要注意任何奇异之处-尝试确保输入的数据不会在变量之间共享。 struct和cell数组使事情变得更加复杂,因此我将更倾向于避免对它们进行处理。



[url=https://stackoverflow.com/questions/1708433]更多&回答...[/url]


所有时间均为北京时间。现在的时间是 10:28

Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.