C++ 什么';这是在Matlab中动态调整矩阵大小的正确方法';是墨西哥吗?
我试图根据输入数据的动态大小在mex中动态地重新定位一些数组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
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 ***