3

我正试图让我的 mex 库避免所有内存分配。
到目前为止,mex 得到了一个输入,使用创建了一些矩阵mxCreate...()并返回了这个输出。
但现在我想修改这个接口,以便 mex 本身不会进行任何分配。
我想到的是 mexFunction 将获取矩阵作为输入以填充值并将这个相同的矩阵作为输出返回。

这应该是可能的吗?

让我想到这是否是我需要做的事情的轻微警报是,左侧参数作为 const 出现在 mexFunction 中,而右侧参数是非常量。要将输入矩阵作为输出返回,我需要删除此 const。

4

2 回答 2

5

Modifying the right-hand arguments would be a bad idea. Those inputs can be reference counted, and if you modify them when the reference count is greater than one, then you will be silently modifying the value stored in other variables as well.

Unfortunately, I don't believe there is a way to do what you want given the existing MEX API.

于 2009-11-11T00:18:57.203 回答
5

有趣的是,前几天我只是在看这个。我找到的最好的信息是这里这里的线程以及这个

基本上它在 Matlab 世界中通常被认为是一件非常糟糕的事情......但同时,没有什么能阻止你,所以你可以做到 - 尝试一些简单的例子,你会看到这些变化被传播了。只需更改您从 prhs 获得的数据(您不需要返回任何内容 - 因为您更改了原始数据,它将反映在工作区的变量中)。

然而,正如链接中指出的那样,由于 Matlabs 写时复制语义,这可能会产生奇怪的后果。设置format debug对于获得直觉很有帮助。如果你这样做a=b了,你会看到 a 和 b 有不同的“结构地址”或标题,表示它们是不同的变量,但数据指针 pr 指向内存中的同一区域。通常,如果您在 Matlab 中更改 y,写入时复制就会启动,并且数据区域在更改之前被复制,因此在 y 之后有一个新的数据指针。当您在 mex 中更改内容时,这不会发生,因此如果您更改了 y,x 也会更改。

我认为这样做是可以的——如果你需要处理大型数据集,它非常有用,但你需要留意任何奇怪的地方——尽量确保你输入的数据不会在变量之间共享。使用 struct 和 cell 数组,事情变得更加复杂,所以我更倾向于避免对它们这样做。

于 2009-11-12T01:05:04.113 回答