2014-02-11 74 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