Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我试图使我的mex库避免所有内存分配,即使如此。
到目前为止,mex获得了输入,使用mxCreate...()创建了一些矩阵并返回了此输出。 但是现在我想修改此接口,以便mex本身不做任何分配。 我想到的是,mexFunction将作为输入矩阵来填充值,并将该矩阵作为输出返回。 这应该可行吗? 使我思考这是否是我需要做的所有事情的轻微警报是,左手参数以const的形式出现在mexFunction中,而右手参数为非const。返回输入矩阵作为输出,我需要删除此const。 回答: 有趣的是,前几天我只是在看这个。最好的信息,我发现线程这里和这里也是这个 。 基本上,在Matlab世界中,这通常被认为是一件非常糟糕的事情……但是,与此同时,没有任何事情可以阻止您,因此您可以做到这一点-尝试一些简单的示例,您将看到所做的更改已得到传播。只需更改从prhs获得的数据即可(您无需返回任何内容-因为您更改了原始数据,因此原始数据将反映在工作空间中的变量中)。 但是,正如链接中指出的那样,由于Matlabs的写时复制语义,这可能会带来奇怪的后果。设置format debug可以在此方面获得很多直觉。如果执行a=b ,则将看到a和b具有不同的“结构地址”或标头,表示它们是不同的变量,但数据指针pr指向内存中的同一区域。通常,如果您在Matlab中更改y,则会写入时复制,并且在更改之前先复制数据区域,因此y之后有一个新的数据指针。当您更改mex中的内容时,这不会发生,因此,如果您更改y,x也会更改。 我认为这样做是可以的-如果您需要处理大型数据集,这是非常有用的,但是您需要注意任何奇异之处-尝试确保输入的数据不会在变量之间共享。 struct和cell数组使事情变得更加复杂,因此我将更倾向于避免对它们进行处理。 更多&回答... |
![]() |
![]() |