是否可以在不使用Matlab上额外内存的情况下创建子数组?

是否可以在不使用Matlab上额外内存的情况下创建子数组?,matlab,pointers,memory,mex,Matlab,Pointers,Memory,Mex,我正试图在Matlab上实现一个算法。它需要在for循环中使用高维数组的切片。当我尝试使用逻辑索引时,Matlab会创建该切片的额外副本,因为我的数组很大,所以需要很多时间 slice = x(startInd:endInd); 我想做的是使用该切片而不复制它。我只需要切片数据来输入一个线性操作符。我不会在迭代期间更新该部分 为此,我尝试编写一个输出为双精度的Mex文件 类型数组,其大小等于预期的切片数据大小 plhs[0] = mxCreateUninitNumericMatrix(0, 0

我正试图在Matlab上实现一个算法。它需要在for循环中使用高维数组的切片。当我尝试使用逻辑索引时,Matlab会创建该切片的额外副本,因为我的数组很大,所以需要很多时间

slice = x(startInd:endInd);
我想做的是使用该切片而不复制它。我只需要切片数据来输入一个线性操作符。我不会在迭代期间更新该部分

为此,我尝试编写一个输出为双精度的Mex文件 类型数组,其大小等于预期的切片数据大小

plhs[0] = mxCreateUninitNumericMatrix(0, 0, mxDOUBLE_CLASS,mxREAL); % initialize but do not allocate any additional memory
ptr1 = mxGetPr(prhs[0]); % get the pointer of the input data
然后将输出指针设置为输入数据的起始索引

mxSetPr(plhs[0], ptr1+startInd);
mxSetM(plhs[0], 1);
mxSetN(plhs[0], (endInd-startInd)); % Update the dimensions as intended
当我将起始索引设置为零时,它就可以正常工作了。当我试图给予 除0以外,Mex文件编译时不会出错,但调用Mex函数时Matlab崩溃

slice = mex_slicer(x, startInd, endInd);

这里可能有什么问题?

将数据指针分配给数组的方式,意味着当数组被删除或分配了其他内容时,MATLAB将尝试释放内存。试图使用malloc未获得的指针调用
free
,将导致崩溃

不幸的是,MATLAB不支持“视图”,即指向不同数组部分的数组。所以没有办法做你想做的事

另一种解决办法是:

  • 以不同的方式存储数据,这样就不会花费太多的时间进行索引(例如,在较小的阵列中)

  • >P>在MX文件中执行C或C++中的所有计算,在这里你可以简单地指向较大的数据块的子范围。


请参阅本FEX提交的关于创建“指向”现有变量内部数据的MATLAB变量的内容。您可以将其作为设计为安全的共享数据副本(但会产生一些额外的开销),也可以作为不受保护的直接引用(速度更快,但如果不正确清除,则可能会导致MATLAB崩溃)


您能否说明实际需要如何在for循环中访问此阵列片?也许您不需要将其分配给中间变量?我猜您在mex文件中的崩溃是由于将相同的内存区域分配给两个matlab变量造成的。Matlab不知道您这样做了,并且在重新分配一个变量时会崩溃。为了避免复制内存,您不应该在单独的变量中创建切片的副本,而应该尝试索引原始的大字段。您可以像示例中那样使用索引数组来执行此操作。但我不能绝对肯定matlab不会在内部复制数据。即使我没有将其分配给中间变量,同样的问题仍然存在。我想,原因是:;在执行逻辑索引时,它会创建“size=size([startInd:endInd])”的索引数组。所以,我在这里尝试做的是一点黑客行为。只需将指针指向一个我知道存在什么的内存位置,并告诉在该内存之后要获取多少元素。我也不想创建任何索引数组。(索引数组的大小约为200万)。