2016-04-14 4 views
0

私は、二重のポインタで定義された2次元配列で使用e.gリターンダブルポインタの2次元マトリックス

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); 

ています私はMathWorks社のMATLABでarrayを返したいです。作業されていない、我々はこのmxSetPr(OUT, *stacked2D);ようmem-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]; 

:私は// memory copy部分が今まで持っていると私はそれは大丈夫だと思うの実行は、私はあるを修正してくださいこの構文では

ヒント説明や回答がありますか?

+2

を第一に、に 'calloc'を使用する必要はありませんC++プログラム。動的にメモリを割り当てる場合は、 'new []'を使います。第二に、より効率的に2D配列を割り当てる方法、[メモリプール全体を割り当てる]方法[この回答を見る](http://stackoverflow.com/questions/23458486/delete-2d-array-c/23458646#23458646)あなたのコードが今やっているようにチャンクではなく。 – PaulMcKenzie

+0

@PaulMcKenzie素晴らしいリンク。あなたがそうすることができるということは、私には起こりませんでした。 – NathanOliver

+0

memcpyの部分については、( 'new []'を2回だけ呼び出す必要があるリンクのメソッドを使用して)配列を割り当てる必要がありますが、データをコピーするには、ソースから 'memcpy'宛先プール。もしあなたのメソッドについていたら、 'n x n'マトリックスに対して' memcpy'を 'n'回呼び出すループが必要になります。 – PaulMcKenzie

答えて

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;