2014-02-11 31 views
2

我正在使用Matlab处理巨大矩阵(超过20.000x20.000双精度)的文件。在完成我的计算之后,我希望将生成的矩阵作为特征矩阵映射到mxArray,而不进行存储器复制并在存储器上分配其他空间。将现有内存映射到Matlab 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(其在本征获得G.data())或是否需要做memcpy的指针。

+0

检查'mxSetPr',它可能会诀窍:http://www.mathworks.com/help/matlab/apiref/mxsetpr.html – sebastian

+0

我相信您传递给'mxSetPr'的指针应该使用MATLAB的内存分配管理功能(所以,'mxMalloc'或'mxCalloc')。当Eigen为'G'分配空间时,它可能使用标准C'malloc'或其他方法。你可能需要找出如何改变它分配内存的方式,或者使用'memcpy'。 –

回答

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