MEX 中 Matlab 和 C++ 之间的内存共享
Memory sharing between Matlab and C++ in MEX
我目前正在尝试编写一个程序来处理一个相当大的文件 (~16GB),然后对其进行分析。理想情况下,我会在 C/C++ 中进行数据处理(我已经编写了一个有效的实现),然后在 Matlab 中进行分析以利用其高效的算法和易用性。
我的自然倾向是在程序开始时使用MEX调用用C编写的例程,然后在Matlab中继续。我想知道的(以及出于某种原因我似乎无法在网上找到的内容)是如果我使用此方法共享内存的方式:
假设我要在 C 中创建一个大型堆分配数组以传递给 Matlab。在我的 Matlab 函数可以处理它之前,这个数组是否需要在内存中复制,或者 Matlab 是否能够直接访问原始数组,而无需额外的复制?我假设并希望这会以第二种方式起作用,但我宁愿在花费时间和精力之前先确定一下。
如果你为此使用了Matlab提供的函数,确实可以共享内存。例如,要创建一个传递回 matlab 的矩阵,您可以使用如下内容:
plhs[0] = mxCreateNumericArray(2, out_dims, mxDOUBLE_CLASS, mxREAL);
double *result = mxGetPr(plhs[0]);
这将创建一个数组,matlab 稍后将使用该数组。您使用 *result 填充它,并且由于内存是使用 mx 函数分配的,因此 matlab 将在适当的时候删除它。
我目前正在尝试编写一个程序来处理一个相当大的文件 (~16GB),然后对其进行分析。理想情况下,我会在 C/C++ 中进行数据处理(我已经编写了一个有效的实现),然后在 Matlab 中进行分析以利用其高效的算法和易用性。
我的自然倾向是在程序开始时使用MEX调用用C编写的例程,然后在Matlab中继续。我想知道的(以及出于某种原因我似乎无法在网上找到的内容)是如果我使用此方法共享内存的方式:
假设我要在 C 中创建一个大型堆分配数组以传递给 Matlab。在我的 Matlab 函数可以处理它之前,这个数组是否需要在内存中复制,或者 Matlab 是否能够直接访问原始数组,而无需额外的复制?我假设并希望这会以第二种方式起作用,但我宁愿在花费时间和精力之前先确定一下。
如果你为此使用了Matlab提供的函数,确实可以共享内存。例如,要创建一个传递回 matlab 的矩阵,您可以使用如下内容:
plhs[0] = mxCreateNumericArray(2, out_dims, mxDOUBLE_CLASS, mxREAL);
double *result = mxGetPr(plhs[0]);
这将创建一个数组,matlab 稍后将使用该数组。您使用 *result 填充它,并且由于内存是使用 mx 函数分配的,因此 matlab 将在适当的时候删除它。