簡體   English   中英

mex內存分配mxRealloc

[英]mex memory allocation mxRealloc

我必須讀取一個double矩陣,處理其值並將其插入新的矩陣中,該矩陣的一維在開始時是未知的。

在靜態內存分配中,我的代碼是:

#include <mex.h>

void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
{
  const mxArray *I = prhs[0];
  double *indata = mxGetPr(I);
  double *submtx = mxGetPr(prhs[1]);
  const int *size = mxGetDimensions(I);
  int xp = (int)submtx[0], yp = (int)submtx[1], zp = (int)submtx[2];
  int xi = size[0], yi = size[1], zi = size[2];

  int numsubmtx = (xi - xp + 1)*(yi - yp + 1)*(zi - zp + 1);
  int out_rows = xp*yp*zp;
  int out_cols = numsubmtx;
  mxArray *out = mxCreateDoubleMatrix( out_rows, out_cols, mxREAL );
  double *outdata = mxGetPr(out);

  int submtx_counter = 0;
  for( int z_offset = 0; ...; z_offset++ ){
        for( int y_offset = 0; ...; y_offset++ ){
              for( int x_offset = 0; ...; x_offset++ ){
                    int row = 0;
                    for( int z_counter = 0; ...; z_counter++ ){
                          for( int y_counter = 0; ...; y_counter++ ){
                                for( int x_counter = 0; ...; x_counter++ ){
                                      outdata[submtx_counter*out_rows + row] = 
                                            indata[ (x_offset+x_counter) + (y_offset+y_counter)*xi + (z_offset+z_counter)*xi*yi ];
                                      ++row;
                                }}}
              ++submtx_counter;
              }}}
  plhs[0] = out;
}

在動態版本中,我不知道out_cols的值,因此當滿足indata值的條件時,我必須重新分配*out

我的想法是這樣的:

#include <mex.h>

void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
{
  const mxArray *I = prhs[0];
  double *indata = mxGetPr(I);
  double *submtx = mxGetPr(prhs[1]);
  const int *size = mxGetDimensions(I);
  int xp = (int)submtx[0], yp = (int)submtx[1], zp = (int)submtx[2];
  int xi = size[0], yi = size[1], zi = size[2];

  int numsubmtx = (xi - xp + 1)*(yi - yp + 1)*(zi - zp + 1);
  int out_rows = xp*yp*zp;
  //int out_cols = numsubmtx; NOW UNKNOWN!
  mxArray *out = NULL;
  double *outdata = mxGetPr(out);

  int submtx_counter = 0;
  for( int z_offset = 0; ...; z_offset++ ){
        for( int y_offset = 0; ...; y_offset++ ){
              for( int x_offset = 0; ...; x_offset++ ){
                    int row = 0;
                    double condition=0;
                    for( int z_counter = 0; ...; z_counter++ ){
                          for( int y_counter = 0; ...; y_counter++ ){
                                for( int x_counter = 0; ...; x_counter++ ){
                                      condition += indata[ (x_offset+x_counter) + (y_offset+y_counter)*xi + (z_offset+z_counter)*xi*yi ]/(xp*yp*zp);
                                      ++row;
                                }}}
                    if(coundition>0.5){
                      out = mxRealloc(out, (submtx_counter+1)*out_rows*sizeof(double));
                      double *outdata = mxGetPr(out);
                      int row = 0;
                      for( int z_counter = 0; ...; z_counter++ ){
                          for( int y_counter = 0; ...; y_counter++ ){
                                for( int x_counter = 0; ...; x_counter++ ){
                                      outdata[submtx_counter*out_rows + row] = indata[ (x_offset+x_counter) + (y_offset+y_counter)*xi + (z_offset+z_counter)*xi*yi ];
                                      ++row;
                                }}}
              ++submtx_counter;
              }
              }}}
  plhs[0] = out;
}

怎么了?

我沒有仔細研究代碼的邏輯,但是我可以看到以下問題:

mxArray *out = NULL;
double *outdata = mxGetPr(out);

out = mxRealloc(out, (submtx_counter+1)*out_rows*sizeof(double));

會有奇怪的行為 mxArray是一種結構,您想為結構所指向的數據而不是結構本身重新分配內存。 相反,嘗試

double *outdata = mxMalloc(out_rows*sizeof(double));

outdata = mxRealloc(outdata, (submtx_counter+1)*out_rows*sizeof(double));

然后在最后創建您的輸出矩陣:

mxArray *out = mxCreateDoubleMatrix(out_rows, submtx_counter, mxREAL);
mxSetPr(out, outdata);
plhs[0] = out;

這將確保元數據out為您提供正確大小的矩陣等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM