Matlab Mex文件和内存管理

Matlab Mex文件和内存管理,matlab,memory,mex,Matlab,Memory,Mex,我有一个mex代码,其中输出变量的名称与输入变量的名称相同,但它会随着mex代码的操作而改变大小。例如,我有一些类似于: A=函数(A),其中输入中的A是100 X 1矢量(在我的模拟中要大得多),输出A是50 X 1矢量。我想了解在这种情况下如何管理内存。操作完成后,A现在是否占用了50 X 1的空间,其余的可以自由分配给其他变量 谢谢 Siddharth这是正确的,原始A的数据缓冲区被MATLAB破坏,并创建了一个新的缓冲区(相同的mxArray结构地址可能是在取消分配原始数组的数据缓冲区后

我有一个mex代码,其中输出变量的名称与输入变量的名称相同,但它会随着mex代码的操作而改变大小。例如,我有一些类似于:

A=函数(A),其中输入中的A是100 X 1矢量(在我的模拟中要大得多),输出A是50 X 1矢量。我想了解在这种情况下如何管理内存。操作完成后,A现在是否占用了50 X 1的空间,其余的可以自由分配给其他变量

谢谢


Siddharth

这是正确的,原始
A
的数据缓冲区被MATLAB破坏,并创建了一个新的缓冲区(相同的
mxArray
结构地址可能是在取消分配原始数组的数据缓冲区后,通过将新的地址复制到原始地址上而重用的)这是假设您没有写入MEX文件中的
prhs[i]

您可以通过
格式调试
看到这一点。您将看到,输出
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 结果是:

prhs[0] = EFBB890, mxGetPr = 6546D840, value = 0.258065 plhs[0] = EFA2DA0, mxGetPr = 77B65660, value = 0.258065
非常有趣的问题。我原以为我知道答案,但在回答这个问题的过程中,我实际上学到了一些关于如何处理这个问题的有趣和意想不到的事情。非常感谢你的回答!非常详细!另外,请看一下我的答案,其中我介绍了共享复制机制。 prhs[0] = EFBB890, mxGetPr = 6546D840, value = 0.258065 plhs[0] = EFA2DA0, mxGetPr = 77B65660, value = 0.258065
#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[],  int nrhs, const mxArray *prhs[])
{
    mxAssert(nrhs == 1 && mxGetM(prhs[0]) == 1, "Input must be a row vector.");
    double *A = mxGetPr(prhs[0]);
    size_t cols = mxGetN(prhs[0]);
    size_t newCols = cols / 2;

    plhs[0] = mxCreateDoubleMatrix(1, newCols, mxREAL);

    for (int i = 0; i < newCols; ++i)
        mxGetPr(plhs[0])[i] = A[i];

    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]));

}