在mex函数中返回双指针2D矩阵

时间:2016-04-14 11:38:06

标签: c++ matlab mex

我正在处理使用双指针e.g

定义的2D数组
double** array;  
array = (double**) calloc(numRows, sizeof(double*));  
for (int i = 0; i < numRows; i++)  
{
   array[i] = (double*) calloc(numCols, sizeof(double));  
   /* then array[i][j] = values */
}

// code to return matlab array
plhs[0] = mxCreateDoubleMatrix(numRows, numCols, mxREAL);

// memory copy
// ?????????

for (i = 0; i < numRows; i++){  
       free(array[i]);  
    }     
 free(array);

我想在matlab中返回array。我到目前为// memory copy部分执行了一次执行,我认为没问题,请更正我是:

stacked1D = mxGetPr(plhs[0]);
int n = 0;
for ( int r = 0; r < max_degree; r++ )
    for ( int c = 0; c < n_vars; c++ )
        stacked1D[n++] = stacked2D[r][c];

我想知道我们是否可以使用mem-copy这样的mxSetPr(OUT, *stacked2D);函数执行此操作,而{{1}}函数在此语法中不起作用。

请你给出一个提示 - 解释或可能的答案?

1 个答案:

答案 0 :(得分:0)

行代码和列迭代应该在代码中颠倒过来,而PaulMcKenzie建议的内容虽然原则上是个好主意但不适用于Mex矩阵(它们是逐列布局的,所以使用这种方法你会必须使用M[column][row]访问您的矩阵,这是非常自然和令人困惑的。)

或者,您可以使用如下的简单包装器:

template <class T, class I = unsigned>
struct MatrixWrapper
{
    T *data;
    I nrows, ncols;

    MatrixWrapper() 
        { clear(); }
    MatrixWrapper( T *data_, I nrows_, I ncols_ )
        { set(data_,nrows_,ncols_); }

    inline void clear()
        { data = NULL; nrows = ncols = 0; }

    inline void set( T *data_, I nrows_, I ncols_ )
        { data = data_; nrows = nrows_; ncols = ncols_; }

    inline T& operator() ( I r, I c ) const
        { return data[ r + nrows*c ]; }
};

你的Mex功能如下:

// allocate a temporary matrix
double *M_data = new double[ nrows*ncols ];
MatrixWrapper<double> M( M_data, nrows, ncols );

// access values with M(i,j) as a "normal" matrix

// allocate a Mex output
plhs[0] = mxCreateDoubleMatrix( nrows, ncols, mxREAL );
MatrixWrapper<double> out0( mxGetPr(plhs[0]), nrows, ncols );

// copy to the Mex output
for ( unsigned c = 0; c < ncols; c++ )
for ( unsigned r = 0; r < nrows; r++ )
    out0(r,c) = M(r,c);

// free temporary allocation
M.clear();
delete[] M_data;