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

Performance MATLAB:如何提高这个特定代码的速度?,performance,matlab,for-loop,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个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

最耗时的部分可能是
imread
,对此您可能无能为力

通过在循环中使用单独的变量,可以稍微减少时间。在代码保持不变的情况下,
imageData
首先是32x32,然后是8x8,在下一次迭代中,Matlab必须分配内存以再次生成
imageData
32x32。可以避免使用两个变量而不是一个变量。另外,
(:)
可能比
重塑
更快:

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

不过,我认为这不会为您节省太多时间。

您希望达到什么样的速度?就我个人而言,我不认为每分钟打开1000张图片不算慢

如果你想要显著的加速,你可能需要跳出框框思考一下。我可以想出一些办法:

  • 与其加载50000张图像,不如尝试将它们保存到一个或几个更大的(mat)文件中,然后从那里加载它们。当然,这只有在您需要多次处理相同的图片时才有帮助

  • 通常,您可以通过使用矢量化来实现加速。我不知道这是否可行,但如果你在几个大图像上调用rgb2gray(原始图像的拼接)并分割结果,可能会比单独处理每个图像快得多


  • 无论如何,一定要使用
    配置文件
    ,关注瓶颈,并保持现实的期望。

    哦,这太可悲了。我以前使用了更多的变量,然后这样做。我同意丹尼斯的观点-?我认为有更好的方法来做到这一点。是的,我是一个早熟的程序员。