我正在为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
。
答案 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
。