我有一个mex代码,其中输出变量与输入变量具有相同的名称,但是由于mex代码的操作,它会改变大小。例如,我有类似的东西:
A =函数(A)其中输入中的A是100 X 1向量(在我的模拟中大得多),输出A是50 X 1向量。我想了解在这种情况下如何管理内存。操作完成后,A现在占用50 X 1的空间,其余的可以自由分配给其他变量吗?
谢谢!
亚洲时报Siddharth
答案 0 :(得分:2)
这是正确的,原始A
的数据缓冲区被MATLAB破坏并创建了一个新缓冲区(相同的mxArray
结构地址可能会被重新使用,大概是通过将新的地址复制到原始地址之后解除分配原始数组的数据缓冲区)。 这假设您不在您的MEX文件中写入prhs[i]
!
您可以使用format debug
查看此信息。您将观察到输出mxArray
具有相同的地址,但它的数据缓冲区具有不同的地址,因此它已明确重新分配输出数组。这表明原始缓冲区已解除分配或排队等待解除分配。
从更改的输出开始,文件testMEX.mexw64
取出输入数组第一行的前半部分并将其复制到新数组中:
>> format debug >> A = rand(1,8) A = Structure address = efbb890 m = 1 n = 8 pr = 77bb6c40 pi = 0 0.2581 0.4087 0.5949 0.2622 0.6028 0.7112 0.2217 0.1174 >> A = testMEX(A) A = Structure address = efbb890 m = 1 n = 4 pr = 77c80380 pi = 0 0.2581 0.4087 0.5949 0.2622
请注意pr
不同,这意味着MATLAB已经创建了一个新的数据缓冲区。但是,mxArray
"结构地址"是一样的。因此,至少会释放旧的数据缓冲区。原始mxArray
结构是否只是变异或是否创建了新的mxArray
是另一个问题(见下文)。
修改:以下是一些证据表明创建了一个全新的mxArray
并将其复制到旧的mxArray
将以下两行添加到MEX功能中:
mexPrintf("prhs[0] = %X, mxGetPr = %X, value = %lf\n",
prhs[0], mxGetPr(prhs[0]), *mxGetPr(prhs[0]));
mexPrintf("plhs[0] = %X, mxGetPr = %X, value = %lf\n",
plhs[0], mxGetPr(plhs[0]), *mxGetPr(plhs[0]));
结果是:
prhs[0] = EFBB890, mxGetPr = 6546D840, value = 0.258065 plhs[0] = EFA2DA0, mxGetPr = 77B65660, value = 0.258065
显然,EFA2DA0上的临时mxArray
包含输出(plhs[0]
),此mxArray
标头/结构完全复制到旧{{ {1}}结构(基础MATLAB工作空间中的mxArray
)。在发生此复制之前,MATLAB肯定会在A
。
<强> testMEX.cpp 强>
6546D840