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
的指針。
檢查'mxSetPr',它可能會訣竅:http://www.mathworks.com/help/matlab/apiref/mxsetpr.html – sebastian
我相信您傳遞給'mxSetPr'的指針應該使用MATLAB的內存分配管理功能(所以,'mxMalloc'或'mxCalloc')。當Eigen爲'G'分配空間時,它可能使用標準C'malloc'或其他方法。你可能需要找出如何改變它分配內存的方式,或者使用'memcpy'。 –