提高Matlab的效率:大数据的多循环
我有以下程序提高Matlab的效率:大数据的多循环,matlab,loops,time,vectorization,large-data,Matlab,Loops,Time,Vectorization,Large Data,我有以下程序 for x = 1:60 for y = 1:160 % load a 2D 'Image' from a 3d matrix for a = 0:52 for b = 0:52 imageWin = Image((a*8+1):(a*8+96), (b*8+1):(b*8+96)); for d = 1:5
for x = 1:60
for y = 1:160
% load a 2D 'Image' from a 3d matrix
for a = 0:52
for b = 0:52
imageWin = Image((a*8+1):(a*8+96), (b*8+1):(b*8+96));
for d = 1:5
[glcm(:,:,d),im] = graycomatrix(imageWin,'NumLevels',256,'G',[],'Symmetric', true,'Offset',d);
end
% Calculation which produce 'results' and takes 0.16 seconds
end
end
finalResult(:,:,y) = result;
end
save(strcat('finalResult', num2str(x),'.mat'), 'finalResult');
end
我的3d矩阵是512x512x160x60。因此,一个“图像”将有280996x96个窗口
如您所见,一个“y”需要7.5分钟,因此完成所有160个需要19个小时,而所有2809x160x60需要更多时间
到目前为止,我已经做了很多改进,不知道还有什么可以做得更好。任何想法都将受到高度赞赏。使用
blockproc
替换a
和b
的for循环。在blockproc
中,将函数句柄指向函数graycomatrix
(与函数的5个循环一起,因此将d的fop循环与函数一起包装到另一个函数中,并将句柄指向该函数)。对x
的循环使用parfor
,但您必须考虑这一点,因为您无法在parfor
循环中保存。在blockproc
中,使UseParallel
为真。另外,预先分配glcm
和finalResult
。使用分析器的详细输出将有助于您从其他人那里获得答案。您是否可以将大小缩小到一些最小数字,并相应地编辑代码?这样做可能更容易测试。另外,当我使用一些随机值运行时,它抛出了这个错误-偏移量必须是一个N×2数组。
。您是否“运行并计时”了它?MATLAB有默认图像,例如cameraman.tif
和peppers.png
。编写一个代码,将这些图像中的一个放入三维数组,并执行任何操作。这样,它将是一个独立的代码。如果您完全确定无法改进功能graycomatrix
,请将其替换为pause(0.16)
或您认为合适的任何时间段。