C++ 什么';这是在Matlab中动态调整矩阵大小的正确方法';是墨西哥吗?

C++ 什么';这是在Matlab中动态调整矩阵大小的正确方法';是墨西哥吗?,c++,matlab,mex,C++,Matlab,Mex,我试图根据输入数据的动态大小在mex中动态地重新定位一些数组 std::vector<mxArray*> arrays; size_t row_size = 1; for(size_t i = 0; i < col_count; ++i) { mxArray* output = mxCreateNumericMatrix(row_size, 1, mxDOUBLE_CLASS, mxREAL); arrays.push_back(outp

我试图根据输入数据的动态大小在mex中动态地重新定位一些数组

   std::vector<mxArray*> arrays;
   size_t row_size = 1;

   for(size_t i = 0; i < col_count; ++i) {
     mxArray* output = mxCreateNumericMatrix(row_size, 1, mxDOUBLE_CLASS, mxREAL);
     arrays.push_back(output);
   }

   void grow() {
     size_t new_size = row_size * 2;
     for(size_t i = 0; i < col_count; ++i)
       mxSetM(arrays[i], new_size);
     row_size = new_size;
   }

   size_t current_row = 0;
   while(...) {
     if(current_row >= row_size)
       grow();

     //do some assignment to the arrays
     double* p = mxGetPr(arrays[col]);
     p[current_row] = value;

     ++current_row;
   }

如果我预先分配了“矩阵”(
grow
从未被调用),那么一切都会正常运行。

mxSetM
没有分配内存,文档中清楚地说明了这一点。调整大小时,您还需要
mxRealloc
mxSetPr
新指针。我假设我需要memcpy现有值,然后?@Alex是的,我认为您需要:(1)分配新内存(2)将现有数组中的双倍复制到新内存(3)将新内存分配给mxray(4)释放旧内存。MatthewGunn列出的步骤可以工作,但使用
mxRealloc
更容易一些。如果您
mxRealloc
new size,现有元素将自动复制,必要时释放旧数组
mxSetPr
指向数组的新指针,然后
mxSetM
设置新行。您将
mxArray*
传递给
mxRealloc
而不是指向实际数据数组的指针。请尝试
mxRealloc(mxGetPr(arrays[i])、new_row_count*sizeof(double))
而不是
mxSetM
不分配内存,文档清楚地说明了这一点。调整大小时,您还需要
mxRealloc
mxSetPr
新指针。我假设我需要memcpy现有值,然后?@Alex是的,我认为您需要:(1)分配新内存(2)将现有数组中的双倍复制到新内存(3)将新内存分配给mxray(4)释放旧内存。MatthewGunn列出的步骤可以工作,但使用
mxRealloc
更容易一些。如果您
mxRealloc
new size,现有元素将自动复制,必要时释放旧数组
mxSetPr
指向数组的新指针,然后
mxSetM
设置新行。您将
mxArray*
传递给
mxRealloc
而不是指向实际数据数组的指针。尝试
mxRealloc(mxGetPr(arrays[i]),改为使用新的行数*sizeof(double))
MATLAB: double free or corruption (out): 0x00007f9714314f50 ***