如果我创建一个包含1000个矩阵的单元格(每个矩阵800 * 1280的大小),使用它后清除每个矩阵会加快计算速度吗?
实施例
A=cell(1000,1);
for i=1:1000
A{i}=rand(800,1280);
end
image=A{1};
image2=A{2}; % I will use image and image2 with other functions
A{1}=[];
A{2}=[];
修改
细胞的真实用途如下:
A=cell(1000,1);
parfor i=1:1000
A{i}=function_that_creates_image(800,1280); % image with size 800*1280 px
end
for i=1:number_of_images % number_of_images=1000 in this case
image1=A{1};
image2=A{2};
A{1}=[];
A{2}=[];
% image1 and image 2 will be used then in the next lines
%next lines of code
end
我注意到在parfor循环中计算A
的组件比计算for
答案 0 :(得分:1)
如果您想使用更少的内存并加快计算速度,那么避免使用单元格会更明智。幸运的是,在你的情况下它非常简单,因为你的所有矩阵都是相同的大小,所以你可以使用ND阵列。
A = zeros(800,1280,1000);
for k = 1:size(A,3)
A(:,:,k) = function_that_creates_image(800,1280);
end
image = A(:,:,1);
image2 = A(:,:,2); % I will use image and image2 with other functions
编辑:
如果您想进一步处理每个图像,我会将它们保存到parfor
内的文件中,因此在第一个循环结束时您将有1000个.mat文件:
parfor k = 1:number_of_images
A = function_that_creates_image(800,1280);
save(['images_dir\image' num2str(k) '.mat'],'A');
end
然后您可以根据需要加载它们以使用load
处理:
for k = 1:number_of_images-1
image1 = load(['images_dir\image' num2str(k) '.mat']);
image2 = load(['images_dir\image' num2str(k+1) '.mat'];
% do what you want with those images...
end
这样,每次只能在内存中保留2张图像,在下一次迭代中,它们将被下一张图像替换。
答案 1 :(得分:1)
如果你把所有内容都装在内存中(你需要至少16GB才能保存数据并对其中的一部分做一些工作,同时你应该拥有32GB的全部野兽),清除这些赢得的内容。改变一切。如果你不这样做,我会假设/希望Matlab和Windows足够聪明,可以优化哪个块保存在内存中,哪个块放在磁盘上,所以再次删除不会有帮助。但你可能不想依赖它。
您可以做的是拥有A{i} = 'path-to-file';
,然后在需要时将其加载到内存中。为什么你甚至需要先加载所有图像,然后逐个进行处理?只需在循环中拥有image1 = rand(...);
,image2 = rand(...);
并重用这些image1
和image2
,内存就会好得多。甚至不需要A
。
通常,如果您希望同时拥有大量数据,则高阵列是您应该使用的内存友好型解决方案。 https://www.mathworks.com/help/matlab/tall-arrays.html