将多维C数组复制到Matlab mxArray类型

时间:2015-08-26 06:22:20

标签: c++ matlab mex

我正在编写一个打开Matlab API引擎的c ++代码。在演示文件Matlab_ROOT / extern / examples / eng_mat / engdemo.cpp中,它显示了如何将简单的1d c样式数组复制到mxArray:

mxArray *T = NULL; double time[10] = {};
T = mxCreateDoubleMatrix( 1,10,mxREAL);
memcpy((void*)mxGetPr(T), (void*)time, sizeof(time));

我能理解这段代码;所以1d mxArray对象线性存储元素。

但是,假设我有一个相同大小的2d(或更多)c数组和mxArray

double time[3][5]; 
mxArray *T; 
T = mxCreateDoubleMatrix(3,5,mxREAL);

我希望将c数组时间的元素复制到mxArray T。我怎样才能做到这一点?我想如果我使用memcpy,它将取决于mxArray个对象中元素存储的顺序。谢谢!

2 个答案:

答案 0 :(得分:3)

无论你的mxArray matlab的维度是什么,它总是将它作为连续的块存储在内存中(列第一顺序)。也就是说,如果您的矩阵M是2乘3

M = [ 11, 12, 13;
      21, 22, 23 ];

在内存中,Matlab将其存储为

[11, 21, 12, 22, 13, 23]

(如果你执行M(:),则会获得相同的顺序。)

因此,要将double[3][5]转换为mxArray,您必须发出几个 memcpy命令:

double* ptr = mxGetPr( T );
for ( int i=0; i<3; i++ )
    memcpy( (void*)(ptr+i*5), (void*)time[i], 5*sizeof(double) );

答案 1 :(得分:2)

另一种方法是在另一个Matlab演示文件matlabroot / extern / examples / refbook / arrayFillSetData.c中说明。除了c样式数组必须采用Matlab支持的类型和线性形式外,事情很有效。 Matlab将2d数组存储在major major和c in row major中,因此必须小心。可能需要转置操作。

#define ROWS 2
#define COLUMNS 2
#define ELEMENTS 4

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
UINT16_T *dynamicData;                        /* pointer to dynamic data */
const UINT16_T data[] = {2, 3, 2, 1};  /* existing data */
mwSize index;

/* Check for proper number of arguments. */
if ( nrhs != 0 ) {
    mexErrMsgIdAndTxt("MATLAB:arrayFillSetData:rhs",
            "This function takes no input arguments.");
} 

/* Create a local array and load data */
dynamicData = mxCalloc(ELEMENTS, sizeof(UINT16_T));
for ( index = 0; index < ELEMENTS; index++ ) {
    dynamicData[index] = data[index];
}

/* Create a 0-by-0 mxArray; you will allocate the memory dynamically */
plhs[0] = mxCreateNumericMatrix(0, 0, mxUINT16_CLASS, mxREAL);

/* Point mxArray to dynamicData */
mxSetData(plhs[0], dynamicData);
mxSetM(plhs[0], ROWS);
mxSetN(plhs[0], COLUMNS);

/* Do not call mxFree(dynamicData) because plhs[0] points to dynamicData */

return;
}
相关问题