MATLAB:如何提高这个特定代码的速度?

时间:2014-04-08 15:23:52

标签: performance matlab for-loop

我基本上是按顺序读取50000个png文件(名为1.png,2.png ....的文件)并逐个将它们转换为灰度。然后我使用重塑功能将这些图像数据转换为单个矢量。 imresize这里将32 * 32图像尺寸缩小到8 * 8。由于下面的for循环花费了很多时间(约5到6分钟),我正在考虑替代方法或任何优化方法。我尝试了来自并行计算工具箱的matlabpool和parfor,但由于我在一台孤立的计算机上工作,它不适合我。请在此代码中向我推荐一些方法或更改。

image_Coll = zeros(8*8,50000);

for k = 1:50000
  imageData = imread(strcat('D:\MATLAB_FILES\KAGGLE_CIFAR\train\',num2str(k), '.png'));
  imageData = imresize(imageData,[8 8]);
  imageData = rgb2gray(imageData);
  imageData=reshape(imageData,8*8,1); % 8 * 8 pixels
  image_Coll(:,k)= imageData;
end

2 个答案:

答案 0 :(得分:1)

最耗时的部分很可能是imread,而你可能做的并不多。

您可以通过在循环中使用单独的变量来减少一点时间。使用您的代码,imageData首先是32x32,然后是8x8,在下一次迭代中,Matlab必须再次分配内存以使imageData 32x32。你可以避免使用两个变量而不是一个。此外,(:)可能比reshape更快:

image_Coll = zeros(8*8,50000);

for k = 1:50000
  imageData = imread(strcat('D:\MATLAB_FILES\KAGGLE_CIFAR\train\',num2str(k), '.png'));
  imageData2 = imresize(imageData,[8 8]);
  imageData2 = rgb2gray(imageData2);
  image_Coll(:,k)= imageData2(:);
end

或者

image_Coll = zeros(8*8,50000);

for k = 1:50000
  imageData = imread(strcat('D:\MATLAB_FILES\KAGGLE_CIFAR\train\',num2str(k), '.png'));
  imageData2(:,k)= rgb2gray(imresize(imageData,[8 8]));
  image_Coll(:,k)= imageData2(:);
end
但是,我不认为这会为你节省很多时间。

答案 1 :(得分:1)

您希望达到什么样的速度?就个人而言,我认为每分钟打开1000张图像并不合格。“

如果你想要显着的加速,你可能需要在框外思考一下。我能提出的一些事情:

  1. 尝试将它们保存到一个或几个较大(垫子)文件中并从那里加载,而不是加载50000个图像。当然,这只有在你需要多次处理相同的照片时才有用。

  2. 通常,您可以通过使用矢量化来实现加速。我不知道是否可能,但如果你在一些大图像(原始图像的串联)上调用rgb2gray并将结果分开,则可能比单独处理每个图像快得多。

  3. 无论如何,请务必使用profile,关注瓶颈并保持现实的期望。