将现有内存映射到Matlab mxArray而不浪费内存

时间:2014-02-11 11:44:02

标签: c++ matlab pointers memory mex

我正在为Matlab提供一个文件,我处理巨大的矩阵(超过20.000x20.000双倍精度)。在计算完成后,我希望将处理为Eigen矩阵的结果矩阵映射到mxArray,而不进行内存复制并在内存上分配其他空间。

Eigen::MatrixXd myfunction(const Eigen::MatrixXd &W)
{
    return W*2;
}

void mexFunction( int nOutputArgs, mxArray *outputArgs[], int nInputArgs, const mxArray * inputArgs[])
{   
    int M = mxGetM(inputArgs[0]);
    int N = mxGetN(inputArgs[0]);

    // Create the input matrix W as Eigen Matrix mapping the input matrix
    Eigen::Map<Eigen::MatrixXd> W( mxGetPr(inputArgs[0]) ,M,N);

    // Allocate space for the output matrix G
    Eigen::MatrixXd G = myfunction(W);

    double *Gdata = G.data();
    outputArgs[0] = mxCreateDoubleMatrix(M,N,mxREAL);
    memcpy(mxGetPr(outputArgs[0]), Gdata, sizeof(double)*M*N);

    return;
}

我问是否不可能只将plhs[0]的指针与矩阵G的指针对齐(在Eigen中获得G.data())或我是否需要做memcpy

1 个答案:

答案 0 :(得分:1)

这可能有用(未经测试,没有matlab准备好):

outputArgs[0] = mxCreateDoubleMatrix(0,0,mxREAL);
mxSetM(outputArgs[0], M);
mxSetN(outputArgs[0], N);
mxSetPr(outputArgs[0], Gdata);

创建一个空矩阵以防止matlab分配你实际上并不需要的一堆内存。

虽然这可行,但要注意:

Eigen::MatrixXd返回时,您必须确保mexFunction在删除此内存块时不会删除此内存块,这可能会发生什么。这会让你再次回到memcpy