【发布时间】:2014-12-24 13:02:18
【问题描述】:
我为 MATLAB 编写了一个 mex 文件。它调用 MATLABpinv 函数来计算 Moore Penrose 伪逆。我将此函数命名为my_pinv。 my_pinv 获取一个数组并返回它的伪逆,与pinv 完全相同:
A = magic(8); A = A(:,1:6)
b = 260*ones(8,1)
x = my_pinv(A)*b
然而,在 mex 文件中,我必须复制输入数组的值才能使用mexCallMATLAB。这里是my_pinv.cpp的内容:
#include <matrix.h>
#include <mex.h>
#include <string.h>
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
#define PRHS_A prhs[0]
#define PLHS_X plhs[0]
int M = mxGetM( PRHS_A ); // Get the dimensions of A.
int N = mxGetN( PRHS_A );
double *A_ptr = mxGetPr( PRHS_A );
mxArray *PINV_A = mxCreateDoubleMatrix(M, N, mxREAL); /* Put input in an mxArray */
memcpy(mxGetPr(PINV_A), A_ptr, sizeof(double)*M*N);
PLHS_X = mxCreateDoubleMatrix(N, M, mxREAL); // Create the output matrix.
mexCallMATLAB(1, &PLHS_X, 1, &PINV_A, "pinv");
}
有没有我跳过使用memcpy 并直接使用mexCallMATLAB 中的输入数组prhs[0]?我实际上不喜欢需要复制输入数组的值的事实,尤其是当输入数组非常大时。
事实上,我希望能够使用类似的东西
mexCallMATLAB(1, &PLHS_X, 1, &RHS_A, "pinv"); // (I know it is not right and the compiler would not like it but it is for the sake of example)
而不是
mexCallMATLAB(1, &PLHS_X, 1, &PINV_A, "pinv");
有人可以分享他/她在这方面的经验吗?
【问题讨论】: