如果我创建一个含有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中的每个循环的每个组件要快。
发布于 2017-06-08 08:00:18
如果您希望使用较少的内存并加快计算速度,则避免使用单元格是更明智的做法。幸运的是,在这种情况下非常容易,因为所有矩阵都是相同大小的,所以可以使用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个图像,在下一次迭代时,它们将被下一个图像替换。
发布于 2017-06-08 08:41:35
如果你把所有的东西都放进内存里(你至少需要16‘t来保存数据并对数据的各个部分做一些工作,同时你应该拥有32’t的内存),清除这些数据根本不会改变任何事情。如果没有,我会假设/希望Matlab和Windows足够聪明,可以优化内存中的哪个块,哪个块放在磁盘上,所以删除不会有帮助。但你可能不想依赖这个。
您可以做的是拥有A{i} = 'path-to-file';,然后在需要的时候将它加载到内存中。为什么你需要先加载所有的图像,然后一个一个地处理它们呢?对于内存来说,将image1 = rand(...);、image2 = rand(...);本身简单地放在循环中并重用这些image1和image2会好得多。甚至不需要拥有这个A。
通常,如果您想同时拥有大量数据,那么高数组是您应该使用的内存友好型解决方案。https://www.mathworks.com/help/matlab/tall-arrays.html
https://stackoverflow.com/questions/44429856
复制相似问题