超过程序允许的最大可变大小
我在这个论坛看到了一些类似的问题,但是我没有找到真正的解决方案来解决这个问题。
我有以下matlab代码,其中我使用非常大的图像(182MP):
%step 1: read the image
image=single(imread('image.tif'));
%step 2: read the image segmentation
regions=imread('image_segmentation.ppm');
%step 3: count the number of segments
number_of_regions=numel(unique(regions));
%step 4: regions label
regions_label=unique(regions);
for i=1:number_of_regions
%pick the pixel indexes of the i'th region
[x_region,y_region]=find(regions==label_regions(i));
%the problem starts here
ndvi_region=(image(x_region,y_region,1)-image(x_region,y_region,3))./(imagem(x_region,y_region,1)+image(x_region,y_region,3));
每次运行具有特定区域的代码时,matlab都会返回错误:超出了程序允许的最大变量大小。
我在群集的群集中运行带有48GB RAM的代码。 该问题仅在地区编号43及以下开始。 其他地区运行良好。
有没有一个聪明的方式来运行这段代码?
我相信问题在于你的使用
image(x_region,y_region,1)
我怀疑你认为访问该地区的N个元素; 但实际上,您访问NxN元素! 对于一个大的地区来说,这很容易炸毁你。 通常,A(vec1,vec2)通过numel(vec2)创建一个numel(vec1)部分。 为了解决这个问题,你需要使用sub2ind函数来查找你需要的索引(或者在find
命令中使用单个参数,并相应地对你的矩阵进行形状化):
% option 1
[x_region, y_region]=find(regions==label_regions(i));
indx1 = sub2ind(size(image), x_region, y_region, 1*ones(size(x_region)));
indx3 = sub2ind(size(image), x_region, y_region, 3*ones(size(x_region)));
ndvi_region = (image(indx1) - image(indx3))./(image(indx1) + image(indx3));
% option 2
indx = find(regions==label_regions(i));
r_image = reshape(image, [], 3); % assuming you have XxYx3 image
ndvi_region = (r_image(indx, 1) - r_image(indx, 3))./(r_image(indx,1) + r_image(indx, 3));
第二种选择是制作图像的完整副本,因此选项1可能更快。
链接地址: http://www.djcxy.com/p/29277.html上一篇: Maximum variable size allowed by the program is exceeded