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'。 –