MATLAB通过下标访问复制3D数组元素时出现内存问题的解决方案咨询
错误原因
你使用的out(row,col,:)语法在MATLAB中会触发笛卡尔积式的广播索引:即会对row和col两个向量的所有元素做两两组合,生成尺寸为121020×121020的二维索引矩阵,扩展到3通道后总容量达到40.9GB,远超常规内存上限。你实际需要的是row和col一一对应的坐标对赋值,而非全量组合赋值。
无循环解决方案
方案1:逻辑索引(最推荐,内存占用最低)
直接通过逻辑掩码完成赋值,无需额外生成row、col下标向量,全程无中间大矩阵生成:
% 生成2D有效区域掩码 mask = ximg > 0 & ximg <= xdim & yimg > 0 & yimg <= ydim; % 扩展为3通道掩码,匹配图像通道维度 mask_3d = repmat(mask, 1, 1, 3); % 直接赋值 out(mask_3d) = image(mask_3d);
该方案的掩码仅为384×512×3的逻辑数组,总内存占用不足1MB,运行效率最高。
方案2:线性索引(适合已获取row、col向量的场景)
如果已经生成了row、col下标向量,可以通过sub2ind生成一一对应的线性索引完成赋值,避免笛卡尔积:
% 生成匹配三通道的一一对应线性索引 idx = sub2ind(size(image), ... repelem(row, 3), ... repelem(col, 3), ... repmat(1:3, length(row), 1)); % 直接赋值 out(idx) = image(idx);
该方案仅生成长度为3×121020的索引向量,内存占用可以忽略。
内容的提问来源于stack exchange,提问作者PManjunatha
相关产品推荐
相关产品推荐

