超出程序允许的最大变量大小 - MATLAB

时间:2013-06-12 12:29:27

标签: image matlab

我在这个论坛上看到了一些类似的问题,但我找不到解决这个问题的真正方法。

我有以下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都会返回错误:超出程序允许的最大变量大小。

我在我的colllege集群中运行带有48GB RAM的代码。该问题仅在43号及以下地区开始。其他地区运行正常。

我是否有一种聪明的方式来运行此代码?

1 个答案:

答案 0 :(得分:3)

我认为问题在于您使用

image(x_region,y_region,1)

我怀疑你认为访问该地区的N个元素;但事实上,你访问NxN元素!对于一个大的地区,这很容易炸毁你。通常,A(vec1,vec2)通过numel(vec2)创建一个数字(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可能更快。